Line Hotness Optimization Source Inline Context
1
#include "Python.h"
2
#include "structmember.h"
3
4
PyDoc_STRVAR(pickle_module_doc,
5
"Optimized C implementation for the Python pickle module.");
6
7
/*[clinic input]
8
module _pickle
9
class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
10
class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
11
class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
12
class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
13
[clinic start generated code]*/
14
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
15
16
/* Bump this when new opcodes are added to the pickle protocol. */
17
enum {
18
    HIGHEST_PROTOCOL = 4,
19
    DEFAULT_PROTOCOL = 3
20
};
21
22
/* Pickle opcodes. These must be kept updated with pickle.py.
23
   Extensive docs are in pickletools.py. */
24
enum opcode {
25
    MARK            = '(',
26
    STOP            = '.',
27
    POP             = '0',
28
    POP_MARK        = '1',
29
    DUP             = '2',
30
    FLOAT           = 'F',
31
    INT             = 'I',
32
    BININT          = 'J',
33
    BININT1         = 'K',
34
    LONG            = 'L',
35
    BININT2         = 'M',
36
    NONE            = 'N',
37
    PERSID          = 'P',
38
    BINPERSID       = 'Q',
39
    REDUCE          = 'R',
40
    STRING          = 'S',
41
    BINSTRING       = 'T',
42
    SHORT_BINSTRING = 'U',
43
    UNICODE         = 'V',
44
    BINUNICODE      = 'X',
45
    APPEND          = 'a',
46
    BUILD           = 'b',
47
    GLOBAL          = 'c',
48
    DICT            = 'd',
49
    EMPTY_DICT      = '}',
50
    APPENDS         = 'e',
51
    GET             = 'g',
52
    BINGET          = 'h',
53
    INST            = 'i',
54
    LONG_BINGET     = 'j',
55
    LIST            = 'l',
56
    EMPTY_LIST      = ']',
57
    OBJ             = 'o',
58
    PUT             = 'p',
59
    BINPUT          = 'q',
60
    LONG_BINPUT     = 'r',
61
    SETITEM         = 's',
62
    TUPLE           = 't',
63
    EMPTY_TUPLE     = ')',
64
    SETITEMS        = 'u',
65
    BINFLOAT        = 'G',
66
67
    /* Protocol 2. */
68
    PROTO       = '\x80',
69
    NEWOBJ      = '\x81',
70
    EXT1        = '\x82',
71
    EXT2        = '\x83',
72
    EXT4        = '\x84',
73
    TUPLE1      = '\x85',
74
    TUPLE2      = '\x86',
75
    TUPLE3      = '\x87',
76
    NEWTRUE     = '\x88',
77
    NEWFALSE    = '\x89',
78
    LONG1       = '\x8a',
79
    LONG4       = '\x8b',
80
81
    /* Protocol 3 (Python 3.x) */
82
    BINBYTES       = 'B',
83
    SHORT_BINBYTES = 'C',
84
85
    /* Protocol 4 */
86
    SHORT_BINUNICODE = '\x8c',
87
    BINUNICODE8      = '\x8d',
88
    BINBYTES8        = '\x8e',
89
    EMPTY_SET        = '\x8f',
90
    ADDITEMS         = '\x90',
91
    FROZENSET        = '\x91',
92
    NEWOBJ_EX        = '\x92',
93
    STACK_GLOBAL     = '\x93',
94
    MEMOIZE          = '\x94',
95
    FRAME            = '\x95'
96
};
97
98
enum {
99
   /* Keep in synch with pickle.Pickler._BATCHSIZE.  This is how many elements
100
      batch_list/dict() pumps out before doing APPENDS/SETITEMS.  Nothing will
101
      break if this gets out of synch with pickle.py, but it's unclear that would
102
      help anything either. */
103
    BATCHSIZE = 1000,
104
105
    /* Nesting limit until Pickler, when running in "fast mode", starts
106
       checking for self-referential data-structures. */
107
    FAST_NESTING_LIMIT = 50,
108
109
    /* Initial size of the write buffer of Pickler. */
110
    WRITE_BUF_SIZE = 4096,
111
112
    /* Prefetch size when unpickling (disabled on unpeekable streams) */
113
    PREFETCH = 8192 * 16,
114
115
    FRAME_SIZE_TARGET = 64 * 1024,
116
117
    FRAME_HEADER_SIZE = 9
118
};
119
120
/*************************************************************************/
121
122
/* State of the pickle module, per PEP 3121. */
123
typedef struct {
124
    /* Exception classes for pickle. */
125
    PyObject *PickleError;
126
    PyObject *PicklingError;
127
    PyObject *UnpicklingError;
128
129
    /* copyreg.dispatch_table, {type_object: pickling_function} */
130
    PyObject *dispatch_table;
131
132
    /* For the extension opcodes EXT1, EXT2 and EXT4. */
133
134
    /* copyreg._extension_registry, {(module_name, function_name): code} */
135
    PyObject *extension_registry;
136
    /* copyreg._extension_cache, {code: object} */
137
    PyObject *extension_cache;
138
    /* copyreg._inverted_registry, {code: (module_name, function_name)} */
139
    PyObject *inverted_registry;
140
141
    /* Import mappings for compatibility with Python 2.x */
142
143
    /* _compat_pickle.NAME_MAPPING,
144
       {(oldmodule, oldname): (newmodule, newname)} */
145
    PyObject *name_mapping_2to3;
146
    /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
147
    PyObject *import_mapping_2to3;
148
    /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
149
    PyObject *name_mapping_3to2;
150
    PyObject *import_mapping_3to2;
151
152
    /* codecs.encode, used for saving bytes in older protocols */
153
    PyObject *codecs_encode;
154
    /* builtins.getattr, used for saving nested names with protocol < 4 */
155
    PyObject *getattr;
156
    /* functools.partial, used for implementing __newobj_ex__ with protocols
157
       2 and 3 */
158
    PyObject *partial;
159
} PickleState;
160
161
/* Forward declaration of the _pickle module definition. */
162
static struct PyModuleDef _picklemodule;
163
164
/* Given a module object, get its per-module state. */
165
static PickleState *
166
_Pickle_GetState(PyObject *module)
167
{
168
    return (PickleState *)PyModule_GetState(module);
inline
                          
PyModule_GetState will not be inlined into _Pickle_GetState because its definition is unavailable 
_Pickle_GetState
169
}
170
171
/* Find the module instance imported in the currently running sub-interpreter
172
   and get its state. */
173
static PickleState *
174
_Pickle_GetGlobalState(void)
175
{
176
    return _Pickle_GetState(PyState_FindModule(&_picklemodule));
inline
                            
PyState_FindModule will not be inlined into _Pickle_GetGlobalState because its definition is unavailable 
_Pickle_GetGlobalState
inline
           
_Pickle_GetState can be inlined into _Pickle_GetGlobalState with cost=-15000 (threshold=375) 
_Pickle_GetGlobalState
inline
           
_Pickle_GetState inlined into _Pickle_GetGlobalState 
_Pickle_GetGlobalState
177
}
178
179
/* Clear the given pickle module state. */
180
static void
181
_Pickle_ClearState(PickleState *st)
182
{
183
    Py_CLEAR(st->PickleError);
184
    Py_CLEAR(st->PicklingError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
185
    Py_CLEAR(st->UnpicklingError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
186
    Py_CLEAR(st->dispatch_table);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
187
    Py_CLEAR(st->extension_registry);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
188
    Py_CLEAR(st->extension_cache);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
189
    Py_CLEAR(st->inverted_registry);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
190
    Py_CLEAR(st->name_mapping_2to3);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
191
    Py_CLEAR(st->import_mapping_2to3);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
192
    Py_CLEAR(st->name_mapping_3to2);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
193
    Py_CLEAR(st->import_mapping_3to2);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
194
    Py_CLEAR(st->codecs_encode);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
195
    Py_CLEAR(st->getattr);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
196
    Py_CLEAR(st->partial);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_ClearState
197
}
198
199
/* Initialize the given pickle module state. */
200
static int
201
_Pickle_InitState(PickleState *st)
202
{
203
    PyObject *builtins;
204
    PyObject *copyreg = NULL;
205
    PyObject *compat_pickle = NULL;
206
    PyObject *codecs = NULL;
207
    PyObject *functools = NULL;
208
209
    builtins = PyEval_GetBuiltins();
inline
               
PyEval_GetBuiltins will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
210
    if (builtins == NULL)
211
        goto error;
212
    st->getattr = PyDict_GetItemString(builtins, "getattr");
inline
                  
PyDict_GetItemString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
213
    if (st->getattr == NULL)
214
        goto error;
215
    Py_INCREF(st->getattr);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
216
217
    copyreg = PyImport_ImportModule("copyreg");
inline
              
PyImport_ImportModule will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
218
    if (!copyreg)
219
        goto error;
220
    st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
inline
                         
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
221
    if (!st->dispatch_table)
222
        goto error;
223
    if (!PyDict_CheckExact(st->dispatch_table)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
224
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
225
                     "copyreg.dispatch_table should be a dict, not %.200s",
226
                     Py_TYPE(st->dispatch_table)->tp_name);
227
        goto error;
228
    }
229
    st->extension_registry = \
230
        PyObject_GetAttrString(copyreg, "_extension_registry");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
231
    if (!st->extension_registry)
232
        goto error;
233
    if (!PyDict_CheckExact(st->extension_registry)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
234
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
235
                     "copyreg._extension_registry should be a dict, "
236
                     "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
237
        goto error;
238
    }
239
    st->inverted_registry = \
240
        PyObject_GetAttrString(copyreg, "_inverted_registry");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
241
    if (!st->inverted_registry)
242
        goto error;
243
    if (!PyDict_CheckExact(st->inverted_registry)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
244
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
245
                     "copyreg._inverted_registry should be a dict, "
246
                     "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
247
        goto error;
248
    }
249
    st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
inline
                          
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
250
    if (!st->extension_cache)
251
        goto error;
252
    if (!PyDict_CheckExact(st->extension_cache)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
253
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
254
                     "copyreg._extension_cache should be a dict, "
255
                     "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
256
        goto error;
257
    }
258
    Py_CLEAR(copyreg);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
259
260
    /* Load the 2.x -> 3.x stdlib module mapping tables */
261
    compat_pickle = PyImport_ImportModule("_compat_pickle");
inline
                    
PyImport_ImportModule will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
262
    if (!compat_pickle)
263
        goto error;
264
    st->name_mapping_2to3 = \
265
        PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
266
    if (!st->name_mapping_2to3)
267
        goto error;
268
    if (!PyDict_CheckExact(st->name_mapping_2to3)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
269
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
270
                     "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
271
                     Py_TYPE(st->name_mapping_2to3)->tp_name);
272
        goto error;
273
    }
274
    st->import_mapping_2to3 = \
275
        PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
276
    if (!st->import_mapping_2to3)
277
        goto error;
278
    if (!PyDict_CheckExact(st->import_mapping_2to3)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
279
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
280
                     "_compat_pickle.IMPORT_MAPPING should be a dict, "
281
                     "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
282
        goto error;
283
    }
284
    /* ... and the 3.x -> 2.x mapping tables */
285
    st->name_mapping_3to2 = \
286
        PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
287
    if (!st->name_mapping_3to2)
288
        goto error;
289
    if (!PyDict_CheckExact(st->name_mapping_3to2)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
290
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
291
                     "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
292
                     "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
293
        goto error;
294
    }
295
    st->import_mapping_3to2 = \
296
        PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
inline
        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
297
    if (!st->import_mapping_3to2)
298
        goto error;
299
    if (!PyDict_CheckExact(st->import_mapping_3to2)) {
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
300
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
301
                     "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
302
                     "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
303
        goto error;
304
    }
305
    Py_CLEAR(compat_pickle);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
306
307
    codecs = PyImport_ImportModule("codecs");
inline
             
PyImport_ImportModule will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
308
    if (codecs == NULL)
309
        goto error;
310
    st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
inline
                        
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
311
    if (st->codecs_encode == NULL) {
312
        goto error;
313
    }
314
    if (!PyCallable_Check(st->codecs_encode)) {
inline
         
PyCallable_Check will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
315
        PyErr_Format(PyExc_RuntimeError,
inline
        
PyErr_Format will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
316
                     "codecs.encode should be a callable, not %.200s",
317
                     Py_TYPE(st->codecs_encode)->tp_name);
gvn
                     
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Pickle_InitState
gvn
                     
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
PyInit__pickle
318
        goto error;
319
    }
320
    Py_CLEAR(codecs);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
321
322
    functools = PyImport_ImportModule("functools");
inline
                
PyImport_ImportModule will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
323
    if (!functools)
324
        goto error;
325
    st->partial = PyObject_GetAttrString(functools, "partial");
inline
                  
PyObject_GetAttrString will not be inlined into _Pickle_InitState because its definition is unavailable 
_Pickle_InitState
326
    if (!st->partial)
327
        goto error;
328
    Py_CLEAR(functools);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
329
330
    return 0;
331
332
  error:
333
    Py_CLEAR(copyreg);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
334
    Py_CLEAR(compat_pickle);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
335
    Py_CLEAR(codecs);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
336
    Py_CLEAR(functools);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_InitState
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PyInit__pickle
337
    _Pickle_ClearState(st);
inline
    
_Pickle_ClearState too costly to inline (cost=630, threshold=625) 
_Pickle_InitState
inline
    
_Pickle_ClearState will not be inlined into _Pickle_InitState 
_Pickle_InitState
inline
    
_Pickle_ClearState too costly to inline (cost=630, threshold=625) 
PyInit__pickle
inline
    
_Pickle_ClearState will not be inlined into PyInit__pickle 
PyInit__pickle
338
    return -1;
339
}
340
341
/* Helper for calling a function with a single argument quickly.
342
343
   This function steals the reference of the given argument. */
344
static PyObject *
345
_Pickle_FastCall(PyObject *func, PyObject *obj)
licm
                           
hosting bitcast 
load_additems
licm
                           
hosting bitcast 
do_append
licm
                           
hosting bitcast 
load
346
{
347
    PyObject *result;
348
349
    result = _PyObject_CallArg1(func, obj);
inline
             
_PyObject_FastCallDict will not be inlined into _Pickle_FastCall because its definition is unavailable 
_Pickle_FastCall
350
    Py_DECREF(obj);
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Pickle_FastCall
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickle_FastCall
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickle_FastCall
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load_additems
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
load_additems
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_additems
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_additems
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
do_append
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
do_append
gvn
    
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
load_persid
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_persid
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_persid
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
load_binpersid
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_binpersid
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_binpersid
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
351
    return result;
352
}
353
354
/*************************************************************************/
355
356
/* Internal data type used as the unpickling stack. */
357
typedef struct {
358
    PyObject_VAR_HEAD
359
    PyObject **data;
360
    int mark_set;          /* is MARK set? */
361
    Py_ssize_t fence;      /* position of top MARK or 0 */
362
    Py_ssize_t allocated;  /* number of slots in data allocated */
363
} Pdata;
364
365
static void
366
Pdata_dealloc(Pdata *self)
367
{
368
    Py_ssize_t i = Py_SIZE(self);
369
    while (--i >= 0) {
loop-vectorize
    
loop not vectorized: control flow cannot be substituted for a select 
Pdata_dealloc
loop-vectorize
    
loop not vectorized 
Pdata_dealloc
370
        Py_DECREF(self->data[i]);
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
Pdata_dealloc
gvn
        
load of type %struct._object** not eliminated in favor of load because it is clobbered by call 
Pdata_dealloc
gvn
        
load eliminated by PRE 
Pdata_dealloc
371
    }
372
    PyMem_FREE(self->data);
inline
    
PyMem_Free will not be inlined into Pdata_dealloc because its definition is unavailable 
Pdata_dealloc
373
    PyObject_Del(self);
inline
    
PyObject_Free will not be inlined into Pdata_dealloc because its definition is unavailable 
Pdata_dealloc
374
}
375
376
static PyTypeObject Pdata_Type = {
377
    PyVarObject_HEAD_INIT(NULL, 0)
378
    "_pickle.Pdata",              /*tp_name*/
379
    sizeof(Pdata),                /*tp_basicsize*/
380
    sizeof(PyObject *),           /*tp_itemsize*/
381
    (destructor)Pdata_dealloc,    /*tp_dealloc*/
382
};
383
384
static PyObject *
385
Pdata_New(void)
386
{
387
    Pdata *self;
388
389
    if (!(self = PyObject_New(Pdata, &Pdata_Type)))
inline
                 
_PyObject_New will not be inlined into Pdata_New because its definition is unavailable 
Pdata_New
390
        return NULL;
391
    Py_SIZE(self) = 0;
392
    self->mark_set = 0;
393
    self->fence = 0;
394
    self->allocated = 8;
395
    self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
inline
                 
PyMem_Malloc will not be inlined into Pdata_New because its definition is unavailable 
Pdata_New
396
    if (self->data)
397
        return (PyObject *)self;
398
    Py_DECREF(self);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Pdata_New
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pdata_New
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_New
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_New
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler___init___impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler___init___impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler___init__
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler___init__
399
    return PyErr_NoMemory();
inline
           
PyErr_NoMemory will not be inlined into Pdata_New because its definition is unavailable 
Pdata_New
400
}
401
402
403
/* Retain only the initial clearto items.  If clearto >= the current
404
 * number of items, this is a (non-erroneous) NOP.
405
 */
406
static int
407
Pdata_clear(Pdata *self, Py_ssize_t clearto)
408
{
409
    Py_ssize_t i = Py_SIZE(self);
gvn
                   
load eliminated by PRE 
do_setitems
410
411
    assert(clearto >= self->fence);
412
    if (clearto >= i)
413
        return 0;
414
415
    while (--i >= clearto) {
loop-vectorize
    
loop not vectorized 
load
loop-vectorize
    
loop not vectorized 
do_append
loop-vectorize
    
loop not vectorized 
do_setitems
416
        Py_CLEAR(self->data[i]);
licm
        
hosting getelementptr 
Pdata_clear
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
Pdata_clear
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
Pdata_clear
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
Pdata_clear
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
Pdata_clear
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_dict
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_dict
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_dict
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load_dict
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_additems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_additems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_additems
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load_additems
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
do_append
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
do_append
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
do_append
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_pop_mark
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_pop_mark
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_pop_mark
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load_pop_mark
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
do_setitems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
do_setitems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
do_setitems
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
do_setitems
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
load
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
do_append
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
do_setitems
417
    }
418
    Py_SIZE(self) = clearto;
419
    return 0;
420
}
421
422
static int
423
Pdata_grow(Pdata *self)
424
{
425
    PyObject **data = self->data;
gvn
                            
load of type i8* eliminated in favor of inttoptr 
load_dup
gvn
                            
load of type i8* not eliminated because it is clobbered by store 
load
426
    size_t allocated = (size_t)self->allocated;
427
    size_t new_allocated;
428
429
    new_allocated = (allocated >> 3) + 6;
430
    /* check for integer overflow */
431
    if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
432
        goto nomemory;
433
    new_allocated += allocated;
434
    PyMem_RESIZE(data, PyObject *, new_allocated);
inline
    
PyMem_Realloc will not be inlined into Pdata_grow because its definition is unavailable 
Pdata_grow
435
    if (data == NULL)
436
        goto nomemory;
437
438
    self->data = data;
439
    self->allocated = (Py_ssize_t)new_allocated;
440
    return 0;
441
442
  nomemory:
443
    PyErr_NoMemory();
inline
    
PyErr_NoMemory will not be inlined into Pdata_grow because its definition is unavailable 
Pdata_grow
444
    return -1;
445
}
446
447
static int
448
Pdata_stack_underflow(Pdata *self)
449
{
450
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into Pdata_stack_underflow with cost=40 (threshold=375) 
Pdata_stack_underflow
inline
                      
_Pickle_GetGlobalState inlined into Pdata_stack_underflow 
Pdata_stack_underflow
451
    PyErr_SetString(st->UnpicklingError,
inline
    
PyErr_SetString will not be inlined into Pdata_stack_underflow because its definition is unavailable 
Pdata_stack_underflow
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
Pdata_stack_underflow
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
Pdata_poptuple
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_tuple
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_tuple
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_additems
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_frozenset
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
Pdata_pop
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_obj
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_inst
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_stack_global
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
do_append
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_append
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_dup
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binput
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binput
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_put
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_memoize
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_pop
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
do_setitems
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binpersid
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_reduce
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load
452
                    self->mark_set ?
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
Pdata_stack_underflow
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
Pdata_poptuple
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_counted_tuple
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_tuple
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_additems
gvn
                          
load of type i32 not eliminated in favor of store because it is clobbered by call 
load_additems
gvn
                          
load of type i32 not eliminated in favor of store because it is clobbered by call 
load_frozenset
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
Pdata_pop
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_obj
gvn
                          
load of type i32 not eliminated in favor of store because it is clobbered by call 
load_obj
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_inst
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_newobj
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_stack_global
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
do_append
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_append
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_build
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_dup
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_binput
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_long_binput
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_put
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_memoize
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_pop
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
do_setitems
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_binpersid
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load_reduce
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
load
gvn
                          
load of type i32 not eliminated in favor of store because it is clobbered by call 
load
453
                    "unexpected MARK found" :
454
                    "unpickling stack underflow");
455
    return -1;
456
}
457
458
/* D is a Pdata*.  Pop the topmost element and store it into V, which
459
 * must be an lvalue holding PyObject*.  On stack underflow, UnpicklingError
460
 * is raised and V is set to NULL.
461
 */
462
static PyObject *
463
Pdata_pop(Pdata *self)
464
{
465
    if (Py_SIZE(self) <= self->fence) {
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
                               
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
        
load of type i64 eliminated in favor of add 
load_newobj
gvn
                               
load of type i64 eliminated in favor of load 
load_newobj
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                               
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 eliminated in favor of add 
load_newobj_ex
gvn
                               
load of type i64 eliminated in favor of load 
load_newobj_ex
gvn
        
load eliminated by PRE 
load_stack_global
gvn
                               
load eliminated by PRE 
load_stack_global
gvn
        
load of type i64 eliminated in favor of add 
load_reduce
gvn
                               
load of type i64 eliminated in favor of load 
load_reduce
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
                               
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
466
        Pdata_stack_underflow(self);
inline
        
Pdata_stack_underflow can be inlined into Pdata_pop with cost=95 (threshold=375) 
Pdata_pop
inline
        
Pdata_stack_underflow inlined into Pdata_pop 
Pdata_pop
467
        return NULL;
468
    }
469
    return self->data[--Py_SIZE(self)];
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load_newobj
gvn
                 
load of type %struct._object** eliminated in favor of load 
load_newobj
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                 
load of type %struct._object** eliminated in favor of load 
load_newobj_ex
gvn
                 
load of type %struct._object** eliminated in favor of load 
load_reduce
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
470
}
471
#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
472
473
static int
474
Pdata_push(Pdata *self, PyObject *obj)
475
{
476
    if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
inline
                                            
Pdata_grow can be inlined into Pdata_push with cost=-14890 (threshold=250) 
Pdata_push
inline
                                            
Pdata_grow inlined into Pdata_push 
Pdata_push
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_tuple
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_list
gvn
        
load eliminated by PRE 
load_dict
gvn
        
load of type i64 eliminated in favor of load 
load_dup
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
477
        return -1;
478
    }
479
    self->data[Py_SIZE(self)++] = obj;
gvn
          
load eliminated by PRE 
Pdata_push
gvn
                            
load of type i64 not eliminated in favor of load because it is clobbered by call 
Pdata_push
gvn
                            
load eliminated by PRE 
Pdata_push
480
    return 0;
481
}
482
483
/* Push an object on stack, transferring its ownership to the stack. */
484
#define PDATA_PUSH(D, O, ER) do {                               \
485
        if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
486
487
/* Push an object on stack, adding a new reference to the object. */
488
#define PDATA_APPEND(D, O, ER) do {                             \
489
        Py_INCREF((O));                                         \
490
        if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
491
492
static PyObject *
493
Pdata_poptuple(Pdata *self, Py_ssize_t start)
494
{
495
    PyObject *tuple;
496
    Py_ssize_t len, i, j;
497
498
    if (start < self->fence) {
gvn
                      
load of type i64 not eliminated because it is clobbered by store 
load_tuple
gvn
                      
load eliminated by PRE 
load_additems
gvn
                      
load of type i64 eliminated in favor of phi 
load_frozenset
gvn
                      
load of type i64 eliminated in favor of phi 
load_obj
gvn
                      
load of type i64 eliminated in favor of phi 
load
499
        Pdata_stack_underflow(self);
inline
        
Pdata_stack_underflow can be inlined into Pdata_poptuple with cost=95 (threshold=375) 
Pdata_poptuple
inline
        
Pdata_stack_underflow inlined into Pdata_poptuple 
Pdata_poptuple
500
        return NULL;
501
    }
502
    len = Py_SIZE(self) - start;
503
    tuple = PyTuple_New(len);
inline
            
PyTuple_New will not be inlined into Pdata_poptuple because its definition is unavailable 
Pdata_poptuple
504
    if (tuple == NULL)
505
        return NULL;
506
    for (i = start, j = 0; j < len; i++, j++)
loop-unroll
    
completely unrolled loop with 3 iterations 
load
loop-unroll
    
completely unrolled loop with 2 iterations 
load
loop-unroll
    
completely unrolled loop with 1 iterations 
load
loop-vectorize
    
loop not vectorized: cannot identify array bounds 
load
loop-vectorize
    
loop not vectorized 
load
loop-unroll
    
unrolled loop by a factor of 4 with run-time trip count 
load
507
        PyTuple_SET_ITEM(tuple, j, self->data[i]);
licm
        
hosting getelementptr 
Pdata_poptuple
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
Pdata_poptuple
licm
        
hosting bitcast 
Pdata_poptuple
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
Pdata_poptuple
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
Pdata_poptuple
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_tuple
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_tuple
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_tuple
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_additems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_additems
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_additems
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_frozenset
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_frozenset
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_frozenset
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_obj
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_obj
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_obj
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_inst
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_inst
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_inst
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._object** not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
508
509
    Py_SIZE(self) = start;
510
    return tuple;
511
}
512
513
static PyObject *
514
Pdata_poplist(Pdata *self, Py_ssize_t start)
515
{
516
    PyObject *list;
517
    Py_ssize_t len, i, j;
518
519
    len = Py_SIZE(self) - start;
520
    list = PyList_New(len);
inline
           
PyList_New will not be inlined into Pdata_poplist because its definition is unavailable 
Pdata_poplist
521
    if (list == NULL)
522
        return NULL;
523
    for (i = start, j = 0; j < len; i++, j++)
loop-vectorize
    
loop not vectorized: cannot identify array bounds 
load
loop-vectorize
    
loop not vectorized 
load
loop-unroll
    
unrolled loop by a factor of 4 with run-time trip count 
load
loop-vectorize
    
loop not vectorized: cannot identify array bounds 
do_append
loop-vectorize
    
loop not vectorized 
do_append
loop-unroll
    
unrolled loop by a factor of 4 with run-time trip count 
do_append
524
        PyList_SET_ITEM(list, j, self->data[i]);
licm
        
hosting getelementptr 
Pdata_poplist
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
Pdata_poplist
licm
        
hosting bitcast 
Pdata_poplist
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
Pdata_poplist
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
Pdata_poplist
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load_list
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load_list
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load_list
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
do_append
gvn
        
load of type %struct._object** not eliminated in favor of load because it is clobbered by call 
do_append
gvn
        
load of type %struct._object** not eliminated in favor of load because it is clobbered by store 
do_append
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
do_append
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._object** not eliminated because it is clobbered by store 
load
525
526
    Py_SIZE(self) = start;
527
    return list;
528
}
529
530
typedef struct {
531
    PyObject *me_key;
532
    Py_ssize_t me_value;
533
} PyMemoEntry;
534
535
typedef struct {
536
    Py_ssize_t mt_mask;
537
    Py_ssize_t mt_used;
538
    Py_ssize_t mt_allocated;
539
    PyMemoEntry *mt_table;
540
} PyMemoTable;
541
542
typedef struct PicklerObject {
543
    PyObject_HEAD
544
    PyMemoTable *memo;          /* Memo table, keep track of the seen
545
                                   objects to support self-referential objects
546
                                   pickling. */
547
    PyObject *pers_func;        /* persistent_id() method, can be NULL */
548
    PyObject *dispatch_table;   /* private dispatch_table, can be NULL */
549
550
    PyObject *write;            /* write() method of the output stream. */
551
    PyObject *output_buffer;    /* Write into a local bytearray buffer before
552
                                   flushing to the stream. */
553
    Py_ssize_t output_len;      /* Length of output_buffer. */
554
    Py_ssize_t max_output_len;  /* Allocation size of output_buffer. */
555
    int proto;                  /* Pickle protocol number, >= 0 */
556
    int bin;                    /* Boolean, true if proto > 0 */
557
    int framing;                /* True when framing is enabled, proto >= 4 */
558
    Py_ssize_t frame_start;     /* Position in output_buffer where the
559
                                   current frame begins. -1 if there
560
                                   is no frame currently open. */
561
562
    Py_ssize_t buf_size;        /* Size of the current buffered pickle data */
563
    int fast;                   /* Enable fast mode if set to a true value.
564
                                   The fast mode disable the usage of memo,
565
                                   therefore speeding the pickling process by
566
                                   not generating superfluous PUT opcodes. It
567
                                   should not be used if with self-referential
568
                                   objects. */
569
    int fast_nesting;
570
    int fix_imports;            /* Indicate whether Pickler should fix
571
                                   the name of globals for Python 2.x. */
572
    PyObject *fast_memo;
573
} PicklerObject;
574
575
typedef struct UnpicklerObject {
576
    PyObject_HEAD
577
    Pdata *stack;               /* Pickle data stack, store unpickled objects. */
578
579
    /* The unpickler memo is just an array of PyObject *s. Using a dict
580
       is unnecessary, since the keys are contiguous ints. */
581
    PyObject **memo;
582
    Py_ssize_t memo_size;       /* Capacity of the memo array */
583
    Py_ssize_t memo_len;        /* Number of objects in the memo */
584
585
    PyObject *pers_func;        /* persistent_load() method, can be NULL. */
586
587
    Py_buffer buffer;
588
    char *input_buffer;
589
    char *input_line;
590
    Py_ssize_t input_len;
591
    Py_ssize_t next_read_idx;
592
    Py_ssize_t prefetched_idx;  /* index of first prefetched byte */
593
594
    PyObject *read;             /* read() method of the input stream. */
595
    PyObject *readline;         /* readline() method of the input stream. */
596
    PyObject *peek;             /* peek() method of the input stream, or NULL */
597
598
    char *encoding;             /* Name of the encoding to be used for
599
                                   decoding strings pickled using Python
600
                                   2.x. The default value is "ASCII" */
601
    char *errors;               /* Name of errors handling scheme to used when
602
                                   decoding strings. The default value is
603
                                   "strict". */
604
    Py_ssize_t *marks;          /* Mark stack, used for unpickling container
605
                                   objects. */
606
    Py_ssize_t num_marks;       /* Number of marks in the mark stack. */
607
    Py_ssize_t marks_size;      /* Current allocated size of the mark stack. */
608
    int proto;                  /* Protocol of the pickle loaded. */
609
    int fix_imports;            /* Indicate whether Unpickler should fix
610
                                   the name of globals pickled by Python 2.x. */
611
} UnpicklerObject;
612
613
typedef struct {
614
    PyObject_HEAD
615
    PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
616
}  PicklerMemoProxyObject;
617
618
typedef struct {
619
    PyObject_HEAD
620
    UnpicklerObject *unpickler;
621
} UnpicklerMemoProxyObject;
622
623
/* Forward declarations */
624
static int save(PicklerObject *, PyObject *, int);
625
static int save_reduce(PicklerObject *, PyObject *, PyObject *);
626
static PyTypeObject Pickler_Type;
627
static PyTypeObject Unpickler_Type;
628
629
#include "clinic/_pickle.c.h"
630
631
/*************************************************************************
632
 A custom hashtable mapping void* to Python ints. This is used by the pickler
633
 for memoization. Using a custom hashtable rather than PyDict allows us to skip
634
 a bunch of unnecessary object creation. This makes a huge performance
635
 difference. */
636
637
#define MT_MINSIZE 8
638
#define PERTURB_SHIFT 5
639
640
641
static PyMemoTable *
642
PyMemoTable_New(void)
643
{
644
    PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
inline
                        
PyMem_Malloc will not be inlined into PyMemoTable_New because its definition is unavailable 
PyMemoTable_New
645
    if (memo == NULL) {
646
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into PyMemoTable_New because its definition is unavailable 
PyMemoTable_New
647
        return NULL;
648
    }
649
650
    memo->mt_used = 0;
651
    memo->mt_allocated = MT_MINSIZE;
652
    memo->mt_mask = MT_MINSIZE - 1;
653
    memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
inline
                     
PyMem_Malloc will not be inlined into PyMemoTable_New because its definition is unavailable 
PyMemoTable_New
654
    if (memo->mt_table == NULL) {
655
        PyMem_FREE(memo);
inline
        
PyMem_Free will not be inlined into PyMemoTable_New because its definition is unavailable 
PyMemoTable_New
656
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into PyMemoTable_New because its definition is unavailable 
PyMemoTable_New
657
        return NULL;
658
    }
659
    memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
660
661
    return memo;
662
}
663
664
static PyMemoTable *
665
PyMemoTable_Copy(PyMemoTable *self)
666
{
667
    Py_ssize_t i;
668
    PyMemoTable *new = PyMemoTable_New();
inline
                       
PyMemoTable_New can be inlined into PyMemoTable_Copy with cost=180 (threshold=250) 
PyMemoTable_Copy
inline
                       
PyMemoTable_New inlined into PyMemoTable_Copy 
PyMemoTable_Copy
669
    if (new == NULL)
670
        return NULL;
671
672
    new->mt_used = self->mt_used;
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
PyMemoTable_Copy
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
Pickler_set_memo
673
    new->mt_allocated = self->mt_allocated;
gvn
                              
load of type i64 not eliminated because it is clobbered by call 
PyMemoTable_Copy
gvn
                              
load of type i64 not eliminated because it is clobbered by call 
Pickler_set_memo
674
    new->mt_mask = self->mt_mask;
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
PyMemoTable_Copy
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
Pickler_set_memo
675
    /* The table we get from _New() is probably smaller than we wanted.
676
       Free it and allocate one that's the right size. */
677
    PyMem_FREE(new->mt_table);
inline
    
PyMem_Free will not be inlined into PyMemoTable_Copy because its definition is unavailable 
PyMemoTable_Copy
gvn
    
load of type i8* not eliminated in favor of store because it is clobbered by call 
PyMemoTable_Copy
gvn
    
load of type i8* not eliminated in favor of store because it is clobbered by call 
Pickler_set_memo
678
    new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
inline
                    
PyMem_Malloc will not be inlined into PyMemoTable_Copy because its definition is unavailable 
PyMemoTable_Copy
gvn
                    
load of type i64 not eliminated in favor of load because it is clobbered by call 
PyMemoTable_Copy
gvn
                    
load of type i64 not eliminated in favor of load because it is clobbered by call 
Pickler_set_memo
679
    if (new->mt_table == NULL) {
680
        PyMem_FREE(new);
inline
        
PyMem_Free will not be inlined into PyMemoTable_Copy because its definition is unavailable 
PyMemoTable_Copy
681
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into PyMemoTable_Copy because its definition is unavailable 
PyMemoTable_Copy
682
        return NULL;
683
    }
684
    for (i = 0; i < self->mt_allocated; i++) {
licm
                          
hosting load 
PyMemoTable_Copy
gvn
                          
load of type i64 not eliminated because it is clobbered by call 
PyMemoTable_Copy
gvn
                          
load of type i64 not eliminated because it is clobbered by call 
Pickler_set_memo
loop-vectorize
    
loop not vectorized 
Pickler_set_memo
loop-unroll
    
unrolled loop by a factor of 2 with run-time trip count 
Pickler_set_memo
685
        Py_XINCREF(self->mt_table[i].me_key);
licm
        
hosting load 
PyMemoTable_Copy
gvn
        
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by store 
PyMemoTable_Copy
gvn
        
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by store 
Pickler_set_memo
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Pickler_set_memo
686
    }
687
    memcpy(new->mt_table, self->mt_table,
gvn
                
load of type i8* eliminated in favor of call 
PyMemoTable_Copy
688
           sizeof(PyMemoEntry) * self->mt_allocated);
689
690
    return new;
691
}
692
693
static Py_ssize_t
694
PyMemoTable_Size(PyMemoTable *self)
695
{
696
    return self->mt_used;
697
}
698
699
static int
700
PyMemoTable_Clear(PyMemoTable *self)
701
{
702
    Py_ssize_t i = self->mt_allocated;
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
Pickler_set_memo
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
Pickler_set_memo
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
Pickler_set_memo
703
704
    while (--i >= 0) {
loop-vectorize
    
loop not vectorized 
Pickler_dealloc
loop-vectorize
    
loop not vectorized 
Pickler_clear
loop-vectorize
    
loop not vectorized 
_pickle_Pickler_clear_memo
loop-vectorize
    
loop not vectorized 
Pickler_set_memo
loop-vectorize
    
loop not vectorized 
_pickle_PicklerMemoProxy_clear
705
        Py_XDECREF(self->mt_table[i].me_key);
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
PyMemoTable_Clear
gvn
        
load of type %struct.PyMemoEntry* not eliminated in favor of load because it is clobbered by call 
PyMemoTable_Clear
gvn
        
load eliminated by PRE 
PyMemoTable_Clear
gvn
        
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
Pickler_set_memo
gvn
        
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
Pickler_set_memo
gvn
        
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
Pickler_set_memo
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Pickler_dealloc
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Pickler_clear
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
_pickle_Pickler_clear_memo
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Pickler_set_memo
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
_pickle_PicklerMemoProxy_clear
706
    }
707
    self->mt_used = 0;
708
    memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
gvn
                                    
load of type i64 not eliminated in favor of load because it is clobbered by call 
PyMemoTable_Clear
gvn
                                    
load eliminated by PRE 
PyMemoTable_Clear
709
    return 0;
710
}
711
712
static void
713
PyMemoTable_Del(PyMemoTable *self)
714
{
715
    if (self == NULL)
716
        return;
717
    PyMemoTable_Clear(self);
inline
    
PyMemoTable_Clear can be inlined into PyMemoTable_Del with cost=95 (threshold=250) 
PyMemoTable_Del
inline
    
PyMemoTable_Clear inlined into PyMemoTable_Del 
PyMemoTable_Del
718
719
    PyMem_FREE(self->mt_table);
inline
    
PyMem_Free will not be inlined into PyMemoTable_Del because its definition is unavailable 
PyMemoTable_Del
gvn
    
load of type i8* not eliminated because it is clobbered by call 
PyMemoTable_Del
gvn
    
load of type i8* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type i8* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type i8* not eliminated in favor of store because it is clobbered by call 
Pickler_set_memo
gvn
    
load of type i8* not eliminated because it is clobbered by call 
Pickler_set_memo
720
    PyMem_FREE(self);
inline
    
PyMem_Free will not be inlined into PyMemoTable_Del because its definition is unavailable 
PyMemoTable_Del
721
}
722
723
/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
724
   can be considerably simpler than dictobject.c's lookdict(). */
725
static PyMemoEntry *
726
_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
727
{
728
    size_t i;
729
    size_t perturb;
730
    size_t mask = (size_t)self->mt_mask;
731
    PyMemoEntry *table = self->mt_table;
732
    PyMemoEntry *entry;
733
    Py_hash_t hash = (Py_hash_t)key >> 3;
734
735
    i = hash & mask;
736
    entry = &table[i];
737
    if (entry->me_key == NULL || entry->me_key == key)
738
        return entry;
739
740
    for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
loop-vectorize
    
loop not vectorized: could not determine number of loop iterations 
save
loop-vectorize
    
loop not vectorized 
save
loop-vectorize
    
loop not vectorized: could not determine number of loop iterations 
memo_get
loop-vectorize
    
loop not vectorized 
memo_get
loop-vectorize
    
loop not vectorized: could not determine number of loop iterations 
save_reduce
loop-vectorize
    
loop not vectorized 
save_reduce
loop-vectorize
    
loop not vectorized: could not determine number of loop iterations 
PyMemoTable_Set
loop-vectorize
    
loop not vectorized 
PyMemoTable_Set
741
        i = (i << 2) + i + perturb + 1;
742
        entry = &table[i & mask];
743
        if (entry->me_key == NULL || entry->me_key == key)
744
            return entry;
745
    }
746
    assert(0);  /* Never reached */
747
    return NULL;
748
}
749
750
/* Returns -1 on failure, 0 on success. */
751
static int
752
_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
753
{
754
    PyMemoEntry *oldtable = NULL;
755
    PyMemoEntry *oldentry, *newentry;
756
    Py_ssize_t new_size = MT_MINSIZE;
757
    Py_ssize_t to_process;
758
759
    assert(min_size > 0);
760
761
    /* Find the smallest valid table size >= min_size. */
762
    while (new_size < min_size && new_size > 0)
loop-vectorize
    
loop not vectorized: could not determine number of loop iterations 
PyMemoTable_Set
loop-vectorize
    
loop not vectorized 
PyMemoTable_Set
763
        new_size <<= 1;
764
    if (new_size <= 0) {
765
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _PyMemoTable_ResizeTable because its definition is unavailable 
_PyMemoTable_ResizeTable
766
        return -1;
767
    }
768
    /* new_size needs to be a power of two. */
769
    assert((new_size & (new_size - 1)) == 0);
770
771
    /* Allocate new table. */
772
    oldtable = self->mt_table;
gvn
                     
load of type %struct.PyMemoEntry* eliminated in favor of load 
PyMemoTable_Set
773
    self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
inline
                     
PyMem_Malloc will not be inlined into _PyMemoTable_ResizeTable because its definition is unavailable 
_PyMemoTable_ResizeTable
774
    if (self->mt_table == NULL) {
775
        self->mt_table = oldtable;
776
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _PyMemoTable_ResizeTable because its definition is unavailable 
_PyMemoTable_ResizeTable
777
        return -1;
778
    }
779
    self->mt_allocated = new_size;
780
    self->mt_mask = new_size - 1;
781
    memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
gvn
                 
load of type i8* eliminated in favor of call 
_PyMemoTable_ResizeTable
782
783
    /* Copy entries from the old table. */
784
    to_process = self->mt_used;
gvn
                       
load of type i64 not eliminated because it is clobbered by call 
_PyMemoTable_ResizeTable
gvn
                       
load of type i64 not eliminated because it is clobbered by call 
PyMemoTable_Set
785
    for (oldentry = oldtable; to_process > 0; oldentry++) {
786
        if (oldentry->me_key != NULL) {
licm
            
sinking ptrtoint 
_PyMemoTable_ResizeTable
loop-vectorize
                      
loop not vectorized: could not determine number of loop iterations 
PyMemoTable_Set
loop-vectorize
                      
loop not vectorized 
PyMemoTable_Set
787
            to_process--;
788
            /* newentry is a pointer to a chunk of the new
789
               mt_table, so we're setting the key:value pair
790
               in-place. */
791
            newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
inline
                       
_PyMemoTable_Lookup can be inlined into _PyMemoTable_ResizeTable with cost=50 (threshold=250) 
_PyMemoTable_ResizeTable
inline
                       
_PyMemoTable_Lookup inlined into _PyMemoTable_ResizeTable 
_PyMemoTable_ResizeTable
792
            newentry->me_key = oldentry->me_key;
gvn
                                         
load of type i64 eliminated in favor of ptrtoint 
_PyMemoTable_ResizeTable
793
            newentry->me_value = oldentry->me_value;
794
        }
795
    }
796
797
    /* Deallocate the old table. */
798
    PyMem_FREE(oldtable);
inline
    
PyMem_Free will not be inlined into _PyMemoTable_ResizeTable because its definition is unavailable 
_PyMemoTable_ResizeTable
799
    return 0;
800
}
801
802
/* Returns NULL on failure, a pointer to the value otherwise. */
803
static Py_ssize_t *
804
PyMemoTable_Get(PyMemoTable *self, PyObject *key)
805
{
806
    PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
inline
                         
_PyMemoTable_Lookup can be inlined into PyMemoTable_Get with cost=50 (threshold=250) 
PyMemoTable_Get
inline
                         
_PyMemoTable_Lookup inlined into PyMemoTable_Get 
PyMemoTable_Get
807
    if (entry->me_key == NULL)
gvn
               
load of type %struct._object* eliminated in favor of phi 
PyMemoTable_Get
808
        return NULL;
809
    return &entry->me_value;
810
}
811
812
/* Returns -1 on failure, 0 on success. */
813
static int
814
PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
815
{
816
    PyMemoEntry *entry;
817
818
    assert(key != NULL);
819
820
    entry = _PyMemoTable_Lookup(self, key);
inline
            
_PyMemoTable_Lookup can be inlined into PyMemoTable_Set with cost=-14950 (threshold=250) 
PyMemoTable_Set
inline
            
_PyMemoTable_Lookup inlined into PyMemoTable_Set 
PyMemoTable_Set
821
    if (entry->me_key != NULL) {
gvn
               
load of type %struct._object* eliminated in favor of phi 
PyMemoTable_Set
822
        entry->me_value = value;
823
        return 0;
824
    }
825
    Py_INCREF(key);
826
    entry->me_key = key;
827
    entry->me_value = value;
828
    self->mt_used++;
829
830
    /* If we added a key, we can safely resize. Otherwise just return!
831
     * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
832
     *
833
     * Quadrupling the size improves average table sparseness
834
     * (reducing collisions) at the cost of some memory. It also halves
835
     * the number of expensive resize operations in a growing memo table.
836
     *
837
     * Very large memo tables (over 50K items) use doubling instead.
838
     * This may help applications with severe memory constraints.
839
     */
840
    if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
gvn
                                      
load of type i64 eliminated in favor of load 
PyMemoTable_Set
841
        return 0;
842
    return _PyMemoTable_ResizeTable(self,
inline
           
_PyMemoTable_ResizeTable can be inlined into PyMemoTable_Set with cost=-14645 (threshold=250) 
PyMemoTable_Set
inline
           
_PyMemoTable_ResizeTable inlined into PyMemoTable_Set 
PyMemoTable_Set
843
        (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
844
}
845
846
#undef MT_MINSIZE
847
#undef PERTURB_SHIFT
848
849
/*************************************************************************/
850
851
852
static int
853
_Pickler_ClearBuffer(PicklerObject *self)
854
{
855
    Py_XSETREF(self->output_buffer,
inline
    
PyBytes_FromStringAndSize will not be inlined into _Pickler_ClearBuffer because its definition is unavailable 
_Pickler_ClearBuffer
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickler_ClearBuffer
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickler_ClearBuffer
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
856
              PyBytes_FromStringAndSize(NULL, self->max_output_len));
857
    if (self->output_buffer == NULL)
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_ClearBuffer
gvn
              
load eliminated by PRE 
_Pickler_ClearBuffer
858
        return -1;
859
    self->output_len = 0;
860
    self->frame_start = -1;
861
    return 0;
862
}
863
864
static void
865
_write_size64(char *out, size_t value)
866
{
867
    size_t i;
868
869
    Py_BUILD_ASSERT(sizeof(size_t) <= 8);
870
871
    for (i = 0; i < sizeof(size_t); i++) {
loop-unroll
    
completely unrolled loop with 8 iterations 
_write_size64
872
        out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
873
    }
874
    for (i = sizeof(size_t); i < 8; i++) {
875
        out[i] = 0;
876
    }
877
}
878
879
static void
880
_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
881
{
882
    qdata[0] = FRAME;
883
    _write_size64(qdata + 1, frame_len);
inline
    
_write_size64 can be inlined into _Pickler_WriteFrameHeader with cost=35 (threshold=375) 
_Pickler_WriteFrameHeader
inline
    
_write_size64 inlined into _Pickler_WriteFrameHeader 
_Pickler_WriteFrameHeader
884
}
885
886
static int
887
_Pickler_CommitFrame(PicklerObject *self)
888
{
889
    size_t frame_len;
890
    char *qdata;
891
892
    if (!self->framing || self->frame_start == -1)
gvn
               
load of type i32 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
                                
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dump_impl
gvn
               
load of type i32 not eliminated because it is clobbered by store 
_pickle_dump
gvn
                                
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dump
gvn
               
load of type i32 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                                
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dumps_impl
gvn
               
load of type i32 not eliminated because it is clobbered by store 
_pickle_dumps
gvn
                                
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dumps
gvn
               
load of type i32 not eliminated in favor of load because it is clobbered by store 
_pickle_Pickler_dump
gvn
                                
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_Pickler_dump
893
        return 0;
894
    frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
gvn
                      
load of type i64 eliminated in favor of add 
_pickle_dump_impl
gvn
                      
load of type i64 eliminated in favor of add 
_pickle_dumps_impl
gvn
                      
load of type i64 eliminated in favor of add 
_pickle_Pickler_dump
895
    qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
gvn
            
load of type %struct.PyBytesObject* eliminated in favor of inttoptr 
_Pickler_GetString
896
    _Pickler_WriteFrameHeader(self, qdata, frame_len);
inline
    
_Pickler_WriteFrameHeader can be inlined into _Pickler_CommitFrame with cost=-14960 (threshold=375) 
_Pickler_CommitFrame
inline
    
_Pickler_WriteFrameHeader inlined into _Pickler_CommitFrame 
_Pickler_CommitFrame
897
    self->frame_start = -1;
898
    return 0;
899
}
900
901
static int
902
_Pickler_OpcodeBoundary(PicklerObject *self)
903
{
904
    Py_ssize_t frame_len;
905
906
    if (!self->framing || self->frame_start == -1)
907
        return 0;
908
    frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
909
    if (frame_len >= FRAME_SIZE_TARGET)
910
        return _Pickler_CommitFrame(self);
inline
               
_Pickler_CommitFrame can be inlined into _Pickler_OpcodeBoundary with cost=105 (threshold=250) 
_Pickler_OpcodeBoundary
inline
               
_Pickler_CommitFrame inlined into _Pickler_OpcodeBoundary 
_Pickler_OpcodeBoundary
911
    else
912
        return 0;
913
}
914
915
static PyObject *
916
_Pickler_GetString(PicklerObject *self)
917
{
918
    PyObject *output_buffer = self->output_buffer;
gvn
                                    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
                                    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump
gvn
                                    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                                    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps
gvn
                                    
load of type i64 not eliminated because it is clobbered by store 
_pickle_Pickler_dump
919
920
    assert(self->output_buffer != NULL);
921
922
    if (_Pickler_CommitFrame(self))
inline
        
_Pickler_CommitFrame can be inlined into _Pickler_GetString with cost=-14895 (threshold=250) 
_Pickler_GetString
inline
        
_Pickler_CommitFrame inlined into _Pickler_GetString 
_Pickler_GetString
923
        return NULL;
924
925
    self->output_buffer = NULL;
926
    /* Resize down to exact size */
927
    if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
inline
        
_PyBytes_Resize will not be inlined into _Pickler_GetString because its definition is unavailable 
_Pickler_GetString
gvn
                                              
load of type i64 not eliminated because it is clobbered by store 
_Pickler_GetString
gvn
                                              
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
                                              
load eliminated by PRE 
_pickle_dump_impl
gvn
                                              
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                                              
load eliminated by PRE 
_pickle_dumps_impl
gvn
                                              
load of type i64 not eliminated because it is clobbered by store 
_pickle_Pickler_dump
gvn
                                              
load eliminated by PRE 
_pickle_Pickler_dump
928
        return NULL;
929
    return output_buffer;
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_GetString
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
930
}
931
932
static int
933
_Pickler_FlushToFile(PicklerObject *self)
934
{
935
    PyObject *output, *result;
936
937
    assert(self->write != NULL);
938
939
    /* This will commit the frame first */
940
    output = _Pickler_GetString(self);
inline
             
Not inlining. Cost of inlining _Pickler_GetString increases the cost of inlining _Pickler_FlushToFile in other contexts 
_Pickler_FlushToFile
inline
             
_Pickler_GetString will not be inlined into _Pickler_FlushToFile 
_Pickler_FlushToFile
inline
             
_Pickler_GetString can be inlined into _pickle_dump_impl with cost=180 (threshold=250) 
_pickle_dump_impl
inline
             
_Pickler_GetString inlined into _pickle_dump_impl 
_pickle_dump_impl
inline
             
_Pickler_GetString can be inlined into _pickle_Pickler_dump with cost=-14820 (threshold=250) 
_pickle_Pickler_dump
inline
             
_Pickler_GetString inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
941
    if (output == NULL)
942
        return -1;
943
944
    result = _Pickle_FastCall(self->write, output);
inline
             
_Pickle_FastCall can be inlined into _Pickler_FlushToFile with cost=70 (threshold=250) 
_Pickler_FlushToFile
inline
             
_Pickle_FastCall inlined into _Pickler_FlushToFile 
_Pickler_FlushToFile
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
                                    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                    
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
_pickle_Pickler_dump
945
    Py_XDECREF(result);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickler_FlushToFile
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
946
    return (result == NULL) ? -1 : 0;
947
}
948
949
static Py_ssize_t
950
_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
951
{
952
    Py_ssize_t i, n, required;
953
    char *buffer;
954
    int need_new_frame;
955
956
    assert(s != NULL);
957
    need_new_frame = (self->framing && self->frame_start == -1);
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_float
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
memo_put
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
memo_put
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_unicode
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_global
licm
                            
hosting getelementptr 
save_tuple
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
licm
                                             
hosting getelementptr 
save_tuple
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_tuple
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_tuple
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by store 
save_tuple
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_tuple
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
save_tuple
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_tuple
gvn
                            
load of type i32 not eliminated because it is clobbered by store 
save_tuple
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_tuple
licm
                            
hosting getelementptr 
batch_list_exact
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
licm
                                             
hosting getelementptr 
batch_list_exact
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                            
load of type i32 not eliminated because it is clobbered by store 
batch_list_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
batch_list_exact
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by store 
batch_list_exact
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_list_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
licm
                            
hosting getelementptr 
save_list
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
licm
                                             
hosting getelementptr 
save_list
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                            
load of type i32 not eliminated because it is clobbered by store 
save_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
save_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by store 
save_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_frozenset
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
licm
                                             
hosting getelementptr 
save_set
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by store 
save_set
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_set
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
save_set
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_set
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_set
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_set
licm
                            
hosting getelementptr 
batch_dict_exact
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
licm
                                             
hosting getelementptr 
batch_dict_exact
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
licm
                            
hosting getelementptr 
save_dict
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
licm
                                             
hosting getelementptr 
save_dict
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_dict
licm
                            
hosting getelementptr 
batch_dict
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
licm
                                             
hosting getelementptr 
batch_dict
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_dict
licm
                            
hosting getelementptr 
batch_list
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
licm
                                             
hosting getelementptr 
batch_list
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by store 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_reduce
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_pers
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save_pers
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_pers
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save_pers
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save
licm
                                             
hosting getelementptr 
save
licm
                                             
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by store 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by store 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by store 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                             
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                            
load of type i32 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
                                             
load of type i64 eliminated in favor of -1 
_pickle_Pickler_dump
gvn
                            
load of type i32 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
                                             
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
958
959
    if (need_new_frame)
960
        n = data_len + FRAME_HEADER_SIZE;
961
    else
962
        n = data_len;
963
964
    required = self->output_len + n;
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
memo_put
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_global
licm
                     
hosting getelementptr 
save_tuple
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_tuple
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_tuple
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_tuple
licm
                     
hosting getelementptr 
batch_list_exact
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
licm
                     
hosting getelementptr 
save_list
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_set
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_set
licm
                     
hosting getelementptr 
batch_dict_exact
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
licm
                     
hosting getelementptr 
save_dict
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_dict
licm
                     
hosting getelementptr 
batch_dict
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_dict
licm
                     
hosting getelementptr 
batch_list
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_pers
licm
                     
hosting getelementptr 
save
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                     
load of type i64 eliminated in favor of 0 
_pickle_Pickler_dump
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
965
    if (required > self->max_output_len) {
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
memo_put
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
licm
                         
hosting getelementptr 
save_tuple
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_tuple
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_tuple
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_tuple
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save_tuple
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_tuple
licm
                         
hosting getelementptr 
batch_list_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
batch_list_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_list_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
licm
                         
hosting getelementptr 
save_list
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_set
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_set
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_set
licm
                         
hosting getelementptr 
batch_dict_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
licm
                         
hosting getelementptr 
save_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_dict
licm
                         
hosting getelementptr 
batch_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
licm
                         
hosting getelementptr 
batch_list
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_pers
licm
                         
hosting getelementptr 
save
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
_pickle_Pickler_dump
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
_pickle_Pickler_dump
966
        /* Make place in buffer for the pickle chunk */
967
        if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
968
            PyErr_NoMemory();
inline
            
PyErr_NoMemory will not be inlined into _Pickler_Write because its definition is unavailable 
_Pickler_Write
969
            return -1;
970
        }
971
        self->max_output_len = (self->output_len + n) / 2 * 3;
972
        if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
inline
            
_PyBytes_Resize will not be inlined into _Pickler_Write because its definition is unavailable 
_Pickler_Write
licm
                                   
hosting getelementptr 
save_tuple
licm
                                   
hosting getelementptr 
batch_list_exact
licm
                                   
hosting getelementptr 
save_list
licm
                                   
hosting getelementptr 
save_set
licm
                                   
hosting getelementptr 
batch_dict_exact
licm
                                   
hosting getelementptr 
save_dict
licm
                                   
hosting getelementptr 
batch_dict
licm
                                   
hosting getelementptr 
batch_list
licm
                                   
hosting getelementptr 
save
973
            return -1;
974
    }
975
    buffer = PyBytes_AS_STRING(self->output_buffer);
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_Pickler_Write
licm
             
hosting getelementptr 
save_tuple
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by store 
save_tuple
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_tuple
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_tuple
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_tuple
licm
             
hosting bitcast 
save_tuple
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
licm
             
hosting getelementptr 
batch_list_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by store 
batch_list_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by store 
batch_list_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list_exact
licm
             
hosting bitcast 
batch_list_exact
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
licm
             
hosting getelementptr 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by store 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by store 
save_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_list
licm
             
hosting bitcast 
save_list
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
licm
             
hosting getelementptr 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by store 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_set
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_set
licm
             
hosting bitcast 
save_set
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
licm
             
hosting getelementptr 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
licm
             
hosting bitcast 
batch_dict_exact
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
licm
             
hosting getelementptr 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save_dict
licm
             
hosting bitcast 
save_dict
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
licm
             
hosting getelementptr 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_dict
licm
             
hosting bitcast 
batch_dict
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
licm
             
hosting getelementptr 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
batch_list
licm
             
hosting bitcast 
batch_list
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
licm
             
hosting getelementptr 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by store 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by store 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated in favor of load because it is clobbered by call 
save
licm
             
hosting bitcast 
save
licm
             
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
             
load eliminated by PRE 
_pickle_Pickler_dump
gvn
             
load of type %struct.PyBytesObject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
976
    if (need_new_frame) {
977
        /* Setup new frame */
978
        Py_ssize_t frame_start = self->output_len;
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Pickler_Write
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_none
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_bool
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
memo_put
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_global
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_tuple
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_tuple
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_set
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_set
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_dict
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
batch_dict
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_pers
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save_pers
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                                       
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
gvn
                                       
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
979
        self->frame_start = frame_start;
licm
              
hosting getelementptr 
save_tuple
licm
              
hosting getelementptr 
batch_list_exact
licm
              
hosting getelementptr 
save_list
licm
              
hosting getelementptr 
save_set
licm
              
hosting getelementptr 
batch_dict_exact
licm
              
hosting getelementptr 
save_dict
licm
              
hosting getelementptr 
batch_dict
licm
              
hosting getelementptr 
batch_list
licm
              
hosting getelementptr 
save
980
        for (i = 0; i < FRAME_HEADER_SIZE; i++) {
981
            /* Write an invalid value, for debugging */
982
            buffer[frame_start + i] = 0xFE;
983
        }
984
        self->output_len += FRAME_HEADER_SIZE;
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_Pickler_Write
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_none
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_bool
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_float
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
memo_put
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_tuple
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_tuple
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_set
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_pers
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
985
    }
986
    if (data_len < 8) {
987
        /* This is faster than memcpy when the string is short. */
988
        for (i = 0; i < data_len; i++) {
loop-unroll
        
completely unrolled loop with 1 iterations 
save_none
loop-unroll
        
completely unrolled loop with 1 iterations 
save_bool
loop-unroll
        
completely unrolled loop with 4 iterations 
save_bool
loop-unroll
        
completely unrolled loop with 2 iterations 
save_long
loop-unroll
        
completely unrolled loop with 1 iterations 
save_long
loop-unroll
        
completely unrolled loop with 1 iterations 
save_float
loop-unroll
        
completely unrolled loop with 1 iterations 
memo_put
loop-unroll
        
completely unrolled loop with 1 iterations 
save_unicode
loop-unroll
        
completely unrolled loop with 1 iterations 
save_global
loop-unroll
        
completely unrolled loop with 1 iterations 
save_tuple
loop-unroll
        
completely unrolled loop with 1 iterations 
batch_list_exact
loop-unroll
        
completely unrolled loop with 1 iterations 
save_list
loop-unroll
        
completely unrolled loop with 1 iterations 
save_frozenset
loop-unroll
        
completely unrolled loop with 1 iterations 
save_set
loop-unroll
        
completely unrolled loop with 1 iterations 
batch_dict_exact
loop-unroll
        
completely unrolled loop with 1 iterations 
save_dict
loop-unroll
        
completely unrolled loop with 1 iterations 
batch_dict
loop-unroll
        
completely unrolled loop with 1 iterations 
batch_list
loop-unroll
        
completely unrolled loop with 1 iterations 
save_reduce
loop-unroll
        
completely unrolled loop with 1 iterations 
save_pers
loop-unroll
        
completely unrolled loop with 1 iterations 
save
loop-unroll
        
completely unrolled loop with 1 iterations 
_pickle_dump_impl
loop-unroll
        
completely unrolled loop with 2 iterations 
_pickle_dump_impl
loop-unroll
        
completely unrolled loop with 1 iterations 
_pickle_dumps_impl
loop-unroll
        
completely unrolled loop with 2 iterations 
_pickle_dumps_impl
loop-unroll
        
completely unrolled loop with 1 iterations 
_pickle_Pickler_dump
loop-unroll
        
completely unrolled loop with 2 iterations 
_pickle_Pickler_dump
loop-vectorize
        
loop not vectorized: cannot identify array bounds 
_Pickler_Write
loop-vectorize
        
loop not vectorized 
_Pickler_Write
loop-unroll
        
unrolled loop by a factor of 4 with run-time trip count 
_Pickler_Write
989
            buffer[self->output_len + i] = s[i];
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
_Pickler_Write
gvn
                                           
load of type i8 not eliminated because it is clobbered by call 
_Pickler_Write
gvn
                                           
load of type i8 not eliminated because it is clobbered by store 
_Pickler_Write
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
_Pickler_Write
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Pickler_Write
licm
                                           
hosting load 
save_none
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_none
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_none
gvn
                         
load eliminated by PRE 
save_none
licm
                                           
hosting load 
save_bool
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_bool
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_bool
gvn
                         
load eliminated by PRE 
save_bool
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_bool
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save_bool
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_long
licm
                                           
hosting load 
save_long
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_long
gvn
                         
load eliminated by PRE 
save_long
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_long
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save_long
gvn
                                           
load of type i8 eliminated in favor of -118 
save_long
gvn
                                           
load of type i8 eliminated in favor of 0 
save_long
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_long
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_float
licm
                                           
hosting load 
save_float
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                         
load eliminated by PRE 
save_float
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_float
licm
                                           
hosting load 
memo_put
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
memo_put
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
memo_put
gvn
                         
load eliminated by PRE 
memo_put
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
licm
                                           
hosting load 
save_unicode
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
                         
load eliminated by PRE 
save_unicode
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_unicode
licm
                                           
hosting load 
save_global
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                         
load eliminated by PRE 
save_global
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_global
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
licm
                                           
hosting load 
save_tuple
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_tuple
gvn
                         
load eliminated by PRE 
save_tuple
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_tuple
licm
                                           
hosting load 
batch_list_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                         
load eliminated by PRE 
batch_list_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list_exact
licm
                                           
hosting load 
save_list
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                         
load eliminated by PRE 
save_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_list
licm
                                           
hosting load 
save_frozenset
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_frozenset
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_frozenset
gvn
                         
load eliminated by PRE 
save_frozenset
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
licm
                                           
hosting load 
save_set
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_set
gvn
                         
load eliminated by PRE 
save_set
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_set
licm
                                           
hosting load 
batch_dict_exact
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict_exact
gvn
                         
load eliminated by PRE 
batch_dict_exact
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict_exact
licm
                                           
hosting load 
save_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
                         
load eliminated by PRE 
save_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_dict
licm
                                           
hosting load 
batch_dict
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
                         
load eliminated by PRE 
batch_dict
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_dict
licm
                                           
hosting load 
batch_list
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list
gvn
                         
load eliminated by PRE 
batch_list
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
batch_list
licm
                                           
hosting load 
save_reduce
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_reduce
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                         
load eliminated by PRE 
save_reduce
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_pers
licm
                                           
hosting load 
save_pers
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_pers
gvn
                         
load eliminated by PRE 
save_pers
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save_pers
licm
                                           
hosting load 
save
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                         
load eliminated by PRE 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
save
gvn
                         
load of type i64 not eliminated in favor of load because it is clobbered by store 
save
licm
                                           
hosting load 
_pickle_dump_impl
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_dump_impl
gvn
                                           
load of type i8 eliminated in favor of -128 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                         
load eliminated by PRE 
_pickle_dump_impl
gvn
                                           
load of type i8 eliminated in favor of trunc 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump
licm
                                           
hosting load 
_pickle_dumps_impl
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_dumps_impl
gvn
                                           
load of type i8 eliminated in favor of -128 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load eliminated by PRE 
_pickle_dumps_impl
gvn
                                           
load of type i8 eliminated in favor of trunc 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                         
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps
licm
                                           
hosting load 
_pickle_Pickler_dump
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_Pickler_dump
gvn
                                           
load of type i8 eliminated in favor of -128 
_pickle_Pickler_dump
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_Pickler_dump
gvn
                         
load eliminated by PRE 
_pickle_Pickler_dump
gvn
                                           
load of type i8 not eliminated in favor of store because it is clobbered by store 
_pickle_Pickler_dump
gvn
                         
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_Pickler_dump
gvn
                         
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
990
        }
991
    }
992
    else {
993
        memcpy(buffer + self->output_len, s, data_len);
gvn
                              
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Pickler_Write
gvn
                              
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                              
load eliminated by PRE 
save_float
994
    }
995
    self->output_len += data_len;
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Pickler_Write
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Pickler_Write
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
_Pickler_Write
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_none
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_bool
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_bool
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_long
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_long
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_float
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_float
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_float
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
memo_put
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_unicode
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_global
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_global
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_tuple
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_tuple
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_tuple
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_list_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
batch_list_exact
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_list
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_frozenset
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_frozenset
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_set
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_set
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_dict_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
batch_dict_exact
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_dict
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_dict
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
batch_dict
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_list
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
batch_list
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_reduce
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_pers
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_pers
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by store 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save
gvn
                     
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dump_impl
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dump
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                     
load of type i64 not eliminated in favor of store because it is clobbered by store 
_pickle_dumps
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
_pickle_dumps
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
_pickle_Pickler_dump
996
    return data_len;
997
}
998
999
static PicklerObject *
1000
_Pickler_New(void)
1001
{
1002
    PicklerObject *self;
1003
1004
    self = PyObject_GC_New(PicklerObject, &Pickler_Type);
inline
           
_PyObject_GC_New will not be inlined into _Pickler_New because its definition is unavailable 
_Pickler_New
1005
    if (self == NULL)
1006
        return NULL;
1007
1008
    self->pers_func = NULL;
1009
    self->dispatch_table = NULL;
1010
    self->write = NULL;
1011
    self->proto = 0;
1012
    self->bin = 0;
1013
    self->framing = 0;
1014
    self->frame_start = -1;
1015
    self->fast = 0;
1016
    self->fast_nesting = 0;
1017
    self->fix_imports = 0;
1018
    self->fast_memo = NULL;
1019
    self->max_output_len = WRITE_BUF_SIZE;
1020
    self->output_len = 0;
1021
1022
    self->memo = PyMemoTable_New();
inline
                 
Not inlining. Cost of inlining PyMemoTable_New increases the cost of inlining _Pickler_New in other contexts 
_Pickler_New
inline
                 
PyMemoTable_New will not be inlined into _Pickler_New 
_Pickler_New
inline
                 
PyMemoTable_New can be inlined into _pickle_dump_impl with cost=180 (threshold=250) 
_pickle_dump_impl
inline
                 
PyMemoTable_New inlined into _pickle_dump_impl 
_pickle_dump_impl
inline
                 
PyMemoTable_New can be inlined into _pickle_dumps_impl with cost=180 (threshold=250) 
_pickle_dumps_impl
inline
                 
PyMemoTable_New inlined into _pickle_dumps_impl 
_pickle_dumps_impl
1023
    self->output_buffer = PyBytes_FromStringAndSize(NULL,
inline
                          
PyBytes_FromStringAndSize will not be inlined into _Pickler_New because its definition is unavailable 
_Pickler_New
1024
                                                    self->max_output_len);
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_Pickler_New
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
gvn
                                                          
load of type i64 not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
1025
1026
    if (self->memo == NULL || self->output_buffer == NULL) {
gvn
              
load of type %struct.PyMemoTable* not eliminated in favor of store because it is clobbered by call 
_Pickler_New
gvn
              
load of type %struct.PyMemoTable* not eliminated in favor of store because it is clobbered by call 
_pickle_dump_impl
gvn
              
load of type %struct.PyMemoTable* not eliminated in favor of store because it is clobbered by call 
_pickle_dump
gvn
              
load of type %struct.PyMemoTable* not eliminated in favor of store because it is clobbered by call 
_pickle_dumps_impl
gvn
              
load of type %struct.PyMemoTable* not eliminated in favor of store because it is clobbered by call 
_pickle_dumps
1027
        Py_DECREF(self);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_Pickler_New
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Pickler_New
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
1028
        return NULL;
1029
    }
1030
    return self;
1031
}
1032
1033
static int
1034
_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
1035
{
1036
    long proto;
1037
1038
    if (protocol == NULL || protocol == Py_None) {
1039
        proto = DEFAULT_PROTOCOL;
1040
    }
1041
    else {
1042
        proto = PyLong_AsLong(protocol);
inline
                
PyLong_AsLong will not be inlined into _Pickler_SetProtocol because its definition is unavailable 
_Pickler_SetProtocol
1043
        if (proto < 0) {
1044
            if (proto == -1 && PyErr_Occurred())
inline
                               
PyErr_Occurred will not be inlined into _Pickler_SetProtocol because its definition is unavailable 
_Pickler_SetProtocol
1045
                return -1;
1046
            proto = HIGHEST_PROTOCOL;
1047
        }
1048
        else if (proto > HIGHEST_PROTOCOL) {
1049
            PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
inline
            
PyErr_Format will not be inlined into _Pickler_SetProtocol because its definition is unavailable 
_Pickler_SetProtocol
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_SetProtocol
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
1050
                         HIGHEST_PROTOCOL);
1051
            return -1;
1052
        }
1053
    }
1054
    self->proto = (int)proto;
1055
    self->bin = proto > 0;
1056
    self->fix_imports = fix_imports && proto < 3;
1057
    return 0;
1058
}
1059
1060
/* Returns -1 (with an exception set) on failure, 0 on success. This may
1061
   be called once on a freshly created Pickler. */
1062
static int
1063
_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1064
{
1065
    _Py_IDENTIFIER(write);
1066
    assert(file != NULL);
1067
    self->write = _PyObject_GetAttrId(file, &PyId_write);
inline
                  
_PyObject_GetAttrId will not be inlined into _Pickler_SetOutputStream because its definition is unavailable 
_Pickler_SetOutputStream
1068
    if (self->write == NULL) {
1069
        if (PyErr_ExceptionMatches(PyExc_AttributeError))
inline
            
PyErr_ExceptionMatches will not be inlined into _Pickler_SetOutputStream because its definition is unavailable 
_Pickler_SetOutputStream
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_SetOutputStream
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
1070
            PyErr_SetString(PyExc_TypeError,
inline
            
PyErr_SetString will not be inlined into _Pickler_SetOutputStream because its definition is unavailable 
_Pickler_SetOutputStream
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_Pickler_SetOutputStream
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_dump
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
1071
                            "file must have a 'write' attribute");
1072
        return -1;
1073
    }
1074
1075
    return 0;
1076
}
1077
1078
/* Returns the size of the input on success, -1 on failure. This takes its
1079
   own reference to `input`. */
1080
static Py_ssize_t
1081
_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1082
{
1083
    if (self->buffer.buf != NULL)
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
_pickle_loads
1084
        PyBuffer_Release(&self->buffer);
inline
        
PyBuffer_Release will not be inlined into _Unpickler_SetStringInput because its definition is unavailable 
_Unpickler_SetStringInput
1085
    if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
inline
        
PyObject_GetBuffer will not be inlined into _Unpickler_SetStringInput because its definition is unavailable 
_Unpickler_SetStringInput
1086
        return -1;
1087
    self->input_buffer = self->buffer.buf;
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_SetStringInput
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads
1088
    self->input_len = self->buffer.len;
gvn
                                   
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_SetStringInput
gvn
                                   
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                                   
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
                                   
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads
1089
    self->next_read_idx = 0;
1090
    self->prefetched_idx = self->input_len;
1091
    return self->input_len;
1092
}
1093
1094
static int
1095
bad_readline(void)
1096
{
1097
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into bad_readline with cost=40 (threshold=375) 
bad_readline
inline
                      
_Pickle_GetGlobalState inlined into bad_readline 
bad_readline
1098
    PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
inline
    
PyErr_SetString will not be inlined into bad_readline because its definition is unavailable 
bad_readline
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
bad_readline
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint1
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint2
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_Readline
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_int
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_long
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_long
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_float
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binfloat
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binbytes
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binstring
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_unicode
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binunicode
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_inst
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_global
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binget
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binget
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_get
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_binput
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binput
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_put
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_persid
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_proto
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_frame
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load
1099
    return -1;
1100
}
1101
1102
static int
1103
_Unpickler_SkipConsumed(UnpicklerObject *self)
1104
{
1105
    Py_ssize_t consumed;
1106
    PyObject *r;
1107
1108
    consumed = self->next_read_idx - self->prefetched_idx;
gvn
                     
load of type i64 not eliminated because it is clobbered by call 
load
gvn
                                           
load of type i64 not eliminated because it is clobbered by call 
load
1109
    if (consumed <= 0)
1110
        return 0;
1111
1112
    assert(self->peek);  /* otherwise we did something wrong */
1113
    /* This makes a useless copy... */
1114
    r = PyObject_CallFunction(self->read, "n", consumed);
inline
        
PyObject_CallFunction will not be inlined into _Unpickler_SkipConsumed because its definition is unavailable 
_Unpickler_SkipConsumed
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
load
1115
    if (r == NULL)
1116
        return -1;
1117
    Py_DECREF(r);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_SkipConsumed
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_SkipConsumed
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
1118
1119
    self->prefetched_idx = self->next_read_idx;
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Unpickler_SkipConsumed
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Unpickler_SkipConsumed
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
                                 
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
1120
    return 0;
1121
}
1122
1123
static const Py_ssize_t READ_WHOLE_LINE = -1;
1124
1125
/* If reading from a file, we need to only pull the bytes we need, since there
1126
   may be multiple pickle objects arranged contiguously in the same input
1127
   buffer.
1128
1129
   If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1130
   bytes from the input stream/buffer.
1131
1132
   Update the unpickler's input buffer with the newly-read data. Returns -1 on
1133
   failure; on success, returns the number of bytes read from the file.
1134
1135
   On success, self->input_len will be 0; this is intentional so that when
1136
   unpickling from a file, the "we've run out of data" code paths will trigger,
1137
   causing the Unpickler to go back to the file for more data. Use the returned
1138
   size to tell you how much data you can process. */
1139
static Py_ssize_t
1140
_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1141
{
1142
    PyObject *data;
1143
    Py_ssize_t read_size;
1144
1145
    assert(self->read != NULL);
1146
1147
    if (_Unpickler_SkipConsumed(self) < 0)
inline
        
_Unpickler_SkipConsumed can be inlined into _Unpickler_ReadFromFile with cost=105 (threshold=250) 
_Unpickler_ReadFromFile
inline
        
_Unpickler_SkipConsumed inlined into _Unpickler_ReadFromFile 
_Unpickler_ReadFromFile
1148
        return -1;
1149
1150
    if (n == READ_WHOLE_LINE) {
1151
        data = _PyObject_CallNoArg(self->readline);
inline
               
_PyObject_FastCallDict will not be inlined into _Unpickler_ReadFromFile because its definition is unavailable 
_Unpickler_ReadFromFile
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1152
    }
1153
    else {
1154
        PyObject *len;
1155
        /* Prefetch some data without advancing the file pointer, if possible */
1156
        if (self->peek && n < PREFETCH) {
gvn
                  
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                  
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1157
            len = PyLong_FromSsize_t(PREFETCH);
inline
                  
PyLong_FromSsize_t will not be inlined into _Unpickler_ReadFromFile because its definition is unavailable 
_Unpickler_ReadFromFile
1158
            if (len == NULL)
1159
                return -1;
1160
            data = _Pickle_FastCall(self->peek, len);
inline
                   
_Pickle_FastCall can be inlined into _Unpickler_ReadFromFile with cost=70 (threshold=250) 
_Unpickler_ReadFromFile
inline
                   
_Pickle_FastCall inlined into _Unpickler_ReadFromFile 
_Unpickler_ReadFromFile
gvn
                                          
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
_Unpickler_ReadFromFile
1161
            if (data == NULL) {
1162
                if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
inline
                     
PyErr_ExceptionMatches will not be inlined into _Unpickler_ReadFromFile because its definition is unavailable 
_Unpickler_ReadFromFile
gvn
                                            
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                                            
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1163
                    return -1;
1164
                /* peek() is probably not supported by the given file object */
1165
                PyErr_Clear();
inline
                
PyErr_Clear will not be inlined into _Unpickler_ReadFromFile because its definition is unavailable 
_Unpickler_ReadFromFile
1166
                Py_CLEAR(self->peek);
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1167
            }
1168
            else {
1169
                read_size = _Unpickler_SetStringInput(self, data);
inline
                            
_Unpickler_SetStringInput can be inlined into _Unpickler_ReadFromFile with cost=95 (threshold=250) 
_Unpickler_ReadFromFile
inline
                            
_Unpickler_SetStringInput inlined into _Unpickler_ReadFromFile 
_Unpickler_ReadFromFile
1170
                Py_DECREF(data);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1171
                self->prefetched_idx = 0;
1172
                if (n <= read_size)
1173
                    return n;
1174
            }
1175
        }
1176
        len = PyLong_FromSsize_t(n);
inline
              
PyLong_FromSsize_t will not be inlined into _Unpickler_ReadFromFile because its definition is unavailable 
_Unpickler_ReadFromFile
1177
        if (len == NULL)
1178
            return -1;
1179
        data = _Pickle_FastCall(self->read, len);
inline
               
_Pickle_FastCall can be inlined into _Unpickler_ReadFromFile with cost=70 (threshold=250) 
_Unpickler_ReadFromFile
inline
               
_Pickle_FastCall inlined into _Unpickler_ReadFromFile 
_Unpickler_ReadFromFile
gvn
                                      
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1180
    }
1181
    if (data == NULL)
1182
        return -1;
1183
1184
    read_size = _Unpickler_SetStringInput(self, data);
inline
                
_Unpickler_SetStringInput can be inlined into _Unpickler_ReadFromFile with cost=95 (threshold=250) 
_Unpickler_ReadFromFile
inline
                
_Unpickler_SetStringInput inlined into _Unpickler_ReadFromFile 
_Unpickler_ReadFromFile
1185
    Py_DECREF(data);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_ReadFromFile
1186
    return read_size;
1187
}
1188
1189
/* Don't call it directly: use _Unpickler_Read() */
1190
static Py_ssize_t
1191
_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n)
1192
{
1193
    Py_ssize_t num_read;
1194
1195
    *s = NULL;
1196
    if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1197
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into _Unpickler_ReadImpl with cost=40 (threshold=375) 
_Unpickler_ReadImpl
inline
                          
_Pickle_GetGlobalState inlined into _Unpickler_ReadImpl 
_Unpickler_ReadImpl
1198
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into _Unpickler_ReadImpl because its definition is unavailable 
_Unpickler_ReadImpl
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_ReadImpl
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint1
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binint2
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_long
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binfloat
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binbytes
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binstring
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binunicode
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binput
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binput
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_proto
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_frame
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
1199
                        "read would overflow (invalid bytecode)");
1200
        return -1;
1201
    }
1202
1203
    /* This case is handled by the _Unpickler_Read() macro for efficiency */
1204
    assert(self->next_read_idx + n > self->input_len);
1205
1206
    if (!self->read)
gvn
               
load of type %struct._object* not eliminated because it is clobbered by store 
_Unpickler_ReadImpl
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_long
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binbytes
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binstring
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binunicode
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_frame
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
licm
               
hosting getelementptr 
load
licm
               
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
               
load of type %struct._object* not eliminated because it is clobbered by call 
load
1207
        return bad_readline();
inline
               
Not inlining. Cost of inlining bad_readline increases the cost of inlining _Unpickler_ReadImpl in other contexts 
_Unpickler_ReadImpl
inline
               
bad_readline will not be inlined into _Unpickler_ReadImpl 
_Unpickler_ReadImpl
inline
               
bad_readline can be inlined into load_binint with cost=85 (threshold=375) 
load_binint
inline
               
bad_readline inlined into load_binint 
load_binint
inline
               
bad_readline can be inlined into load_binint1 with cost=85 (threshold=375) 
load_binint1
inline
               
bad_readline inlined into load_binint1 
load_binint1
inline
               
bad_readline can be inlined into load_binint2 with cost=85 (threshold=375) 
load_binint2
inline
               
bad_readline inlined into load_binint2 
load_binint2
inline
               
bad_readline can be inlined into load_counted_long with cost=85 (threshold=375) 
load_counted_long
inline
               
bad_readline inlined into load_counted_long 
load_counted_long
inline
               
bad_readline can be inlined into load_binfloat with cost=85 (threshold=375) 
load_binfloat
inline
               
bad_readline inlined into load_binfloat 
load_binfloat
inline
               
bad_readline can be inlined into load_counted_binbytes with cost=85 (threshold=375) 
load_counted_binbytes
inline
               
bad_readline inlined into load_counted_binbytes 
load_counted_binbytes
inline
               
bad_readline can be inlined into load_counted_binstring with cost=85 (threshold=375) 
load_counted_binstring
inline
               
bad_readline inlined into load_counted_binstring 
load_counted_binstring
inline
               
bad_readline can be inlined into load_counted_binunicode with cost=85 (threshold=375) 
load_counted_binunicode
inline
               
bad_readline inlined into load_counted_binunicode 
load_counted_binunicode
inline
               
bad_readline can be inlined into load_binget with cost=85 (threshold=375) 
load_binget
inline
               
bad_readline inlined into load_binget 
load_binget
inline
               
bad_readline can be inlined into load_long_binget with cost=85 (threshold=375) 
load_long_binget
inline
               
bad_readline inlined into load_long_binget 
load_long_binget
inline
               
bad_readline can be inlined into load_binput with cost=85 (threshold=375) 
load_binput
inline
               
bad_readline inlined into load_binput 
load_binput
inline
               
bad_readline can be inlined into load_long_binput with cost=85 (threshold=375) 
load_long_binput
inline
               
bad_readline inlined into load_long_binput 
load_long_binput
inline
               
bad_readline can be inlined into load_proto with cost=85 (threshold=375) 
load_proto
inline
               
bad_readline inlined into load_proto 
load_proto
inline
               
bad_readline can be inlined into load_frame with cost=85 (threshold=375) 
load_frame
inline
               
bad_readline inlined into load_frame 
load_frame
inline
               
bad_readline can be inlined into load_extension with cost=85 (threshold=375) 
load_extension
inline
               
bad_readline inlined into load_extension 
load_extension
inline
               
bad_readline can be inlined into load with cost=85 (threshold=375) 
load
inline
               
bad_readline inlined into load 
load
1208
1209
    num_read = _Unpickler_ReadFromFile(self, n);
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
_Unpickler_ReadImpl
inline
               
_Unpickler_ReadFromFile will not be inlined into _Unpickler_ReadImpl 
_Unpickler_ReadImpl
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binint
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binint 
load_binint
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binint1
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binint1 
load_binint1
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binint2
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binint2 
load_binint2
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_counted_long
inline
               
_Unpickler_ReadFromFile will not be inlined into load_counted_long 
load_counted_long
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binfloat
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binfloat 
load_binfloat
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_counted_binbytes
inline
               
_Unpickler_ReadFromFile will not be inlined into load_counted_binbytes 
load_counted_binbytes
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_counted_binstring
inline
               
_Unpickler_ReadFromFile will not be inlined into load_counted_binstring 
load_counted_binstring
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_counted_binunicode
inline
               
_Unpickler_ReadFromFile will not be inlined into load_counted_binunicode 
load_counted_binunicode
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binget
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binget 
load_binget
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_long_binget
inline
               
_Unpickler_ReadFromFile will not be inlined into load_long_binget 
load_long_binget
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_binput
inline
               
_Unpickler_ReadFromFile will not be inlined into load_binput 
load_binput
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_long_binput
inline
               
_Unpickler_ReadFromFile will not be inlined into load_long_binput 
load_long_binput
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_proto
inline
               
_Unpickler_ReadFromFile will not be inlined into load_proto 
load_proto
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load_frame
inline
               
_Unpickler_ReadFromFile will not be inlined into load_frame 
load_frame
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_frame
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load_extension
inline
               
_Unpickler_ReadFromFile will not be inlined into load_extension 
load_extension
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=660, threshold=625) 
load
inline
               
_Unpickler_ReadFromFile will not be inlined into load 
load
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=635, threshold=625) 
load
1210
    if (num_read < 0)
1211
        return -1;
1212
    if (num_read < n)
1213
        return bad_readline();
inline
               
Not inlining. Cost of inlining bad_readline increases the cost of inlining _Unpickler_ReadImpl in other contexts 
_Unpickler_ReadImpl
inline
               
bad_readline will not be inlined into _Unpickler_ReadImpl 
_Unpickler_ReadImpl
inline
               
bad_readline can be inlined into load_binint with cost=85 (threshold=375) 
load_binint
inline
               
bad_readline inlined into load_binint 
load_binint
inline
               
bad_readline can be inlined into load_binint1 with cost=85 (threshold=375) 
load_binint1
inline
               
bad_readline inlined into load_binint1 
load_binint1
inline
               
bad_readline can be inlined into load_binint2 with cost=85 (threshold=375) 
load_binint2
inline
               
bad_readline inlined into load_binint2 
load_binint2
inline
               
bad_readline can be inlined into load_counted_long with cost=85 (threshold=375) 
load_counted_long
inline
               
bad_readline inlined into load_counted_long 
load_counted_long
inline
               
bad_readline can be inlined into load_binfloat with cost=85 (threshold=375) 
load_binfloat
inline
               
bad_readline inlined into load_binfloat 
load_binfloat
inline
               
bad_readline can be inlined into load_counted_binbytes with cost=85 (threshold=375) 
load_counted_binbytes
inline
               
bad_readline inlined into load_counted_binbytes 
load_counted_binbytes
inline
               
bad_readline can be inlined into load_counted_binstring with cost=85 (threshold=375) 
load_counted_binstring
inline
               
bad_readline inlined into load_counted_binstring 
load_counted_binstring
inline
               
bad_readline can be inlined into load_counted_binunicode with cost=85 (threshold=375) 
load_counted_binunicode
inline
               
bad_readline inlined into load_counted_binunicode 
load_counted_binunicode
inline
               
bad_readline can be inlined into load_binget with cost=85 (threshold=375) 
load_binget
inline
               
bad_readline inlined into load_binget 
load_binget
inline
               
bad_readline can be inlined into load_long_binget with cost=85 (threshold=375) 
load_long_binget
inline
               
bad_readline inlined into load_long_binget 
load_long_binget
inline
               
bad_readline can be inlined into load_binput with cost=85 (threshold=375) 
load_binput
inline
               
bad_readline inlined into load_binput 
load_binput
inline
               
bad_readline can be inlined into load_long_binput with cost=85 (threshold=375) 
load_long_binput
inline
               
bad_readline inlined into load_long_binput 
load_long_binput
inline
               
bad_readline can be inlined into load_proto with cost=85 (threshold=375) 
load_proto
inline
               
bad_readline inlined into load_proto 
load_proto
inline
               
bad_readline can be inlined into load_frame with cost=85 (threshold=375) 
load_frame
inline
               
bad_readline inlined into load_frame 
load_frame
inline
               
bad_readline can be inlined into load_extension with cost=85 (threshold=375) 
load_extension
inline
               
bad_readline inlined into load_extension 
load_extension
inline
               
bad_readline can be inlined into load with cost=-14915 (threshold=375) 
load
inline
               
bad_readline inlined into load 
load
1214
    *s = self->input_buffer;
gvn
               
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ReadImpl
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binint
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binint1
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binint2
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_counted_long
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binfloat
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_counted_binbytes
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_counted_binstring
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_counted_binunicode
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binget
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_long_binget
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_binput
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_long_binput
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_proto
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_frame
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load_extension
licm
               
hosting getelementptr 
load
licm
               
hosting bitcast 
load
licm
               
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
               
load of type i64 not eliminated because it is clobbered by call 
load
1215
    self->next_read_idx = n;
1216
    return n;
1217
}
1218
1219
/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1220
1221
   This should be used for all data reads, rather than accessing the unpickler's
1222
   input buffer directly. This method deals correctly with reading from input
1223
   streams, which the input buffer doesn't deal with.
1224
1225
   Note that when reading from a file-like object, self->next_read_idx won't
1226
   be updated (it should remain at 0 for the entire unpickling process). You
1227
   should use this function's return value to know how many bytes you can
1228
   consume.
1229
1230
   Returns -1 (with an exception set) on failure. On success, return the
1231
   number of chars read. */
1232
#define _Unpickler_Read(self, s, n) \
1233
    (((n) <= (self)->input_len - (self)->next_read_idx)      \
1234
     ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \
1235
        (self)->next_read_idx += (n),                        \
1236
        (n))                                                 \
1237
     : _Unpickler_ReadImpl(self, (s), (n)))
1238
1239
static Py_ssize_t
1240
_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1241
                    char **result)
1242
{
1243
    char *input_line = PyMem_Realloc(self->input_line, len + 1);
inline
                       
PyMem_Realloc will not be inlined into _Unpickler_CopyLine because its definition is unavailable 
_Unpickler_CopyLine
gvn
                                           
load of type i8* not eliminated because it is clobbered by call 
_Unpickler_Readline
1244
    if (input_line == NULL) {
1245
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _Unpickler_CopyLine because its definition is unavailable 
_Unpickler_CopyLine
1246
        return -1;
1247
    }
1248
1249
    memcpy(input_line, line, len);
1250
    input_line[len] = '\0';
1251
    self->input_line = input_line;
1252
    *result = self->input_line;
1253
    return len;
1254
}
1255
1256
/* Read a line from the input stream/buffer. If we run off the end of the input
1257
   before hitting \n, raise an error.
1258
1259
   Returns the number of chars read, or -1 on failure. */
1260
static Py_ssize_t
1261
_Unpickler_Readline(UnpicklerObject *self, char **result)
1262
{
1263
    Py_ssize_t i, num_read;
1264
1265
    for (i = self->next_read_idx; i < self->input_len; i++) {
licm
                                            
hosting getelementptr 
_Unpickler_Readline
licm
                                            
hosting load 
_Unpickler_Readline
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
_Unpickler_Readline
loop-vectorize
    
loop not vectorized 
_Unpickler_Readline
1266
        if (self->input_buffer[i] == '\n') {
licm
                  
hosting getelementptr 
_Unpickler_Readline
licm
                  
failed to hoist load with loop-invariant address because load is conditionally executed 
_Unpickler_Readline
1267
            char *line_start = self->input_buffer + self->next_read_idx;
1268
            num_read = i - self->next_read_idx + 1;
1269
            self->next_read_idx = i + 1;
1270
            return _Unpickler_CopyLine(self, line_start, num_read, result);
inline
                   
_Unpickler_CopyLine can be inlined into _Unpickler_Readline with cost=65 (threshold=250) 
_Unpickler_Readline
inline
                   
_Unpickler_CopyLine inlined into _Unpickler_Readline 
_Unpickler_Readline
1271
        }
1272
    }
1273
    if (!self->read)
1274
        return bad_readline();
inline
               
bad_readline can be inlined into _Unpickler_Readline with cost=85 (threshold=375) 
_Unpickler_Readline
inline
               
bad_readline inlined into _Unpickler_Readline 
_Unpickler_Readline
1275
1276
    num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
inline
               
_Unpickler_ReadFromFile too costly to inline (cost=355, threshold=250) 
_Unpickler_Readline
inline
               
_Unpickler_ReadFromFile will not be inlined into _Unpickler_Readline 
_Unpickler_Readline
1277
    if (num_read < 0)
1278
        return -1;
1279
    if (num_read == 0 || self->input_buffer[num_read - 1] != '\n')
gvn
                               
load of type i8* not eliminated because it is clobbered by call 
_Unpickler_Readline
1280
        return bad_readline();
inline
               
bad_readline can be inlined into _Unpickler_Readline with cost=85 (threshold=375) 
_Unpickler_Readline
inline
               
bad_readline inlined into _Unpickler_Readline 
_Unpickler_Readline
1281
    self->next_read_idx = num_read;
1282
    return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
inline
           
_Unpickler_CopyLine can be inlined into _Unpickler_Readline with cost=-14935 (threshold=250) 
_Unpickler_Readline
inline
           
_Unpickler_CopyLine inlined into _Unpickler_Readline 
_Unpickler_Readline
1283
}
1284
1285
/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1286
   will be modified in place. */
1287
static int
1288
_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1289
{
1290
    Py_ssize_t i;
1291
1292
    assert(new_size > self->memo_size);
1293
1294
    PyMem_RESIZE(self->memo, PyObject *, new_size);
inline
    
PyMem_Realloc will not be inlined into _Unpickler_ResizeMemoList because its definition is unavailable 
_Unpickler_ResizeMemoList
1295
    if (self->memo == NULL) {
1296
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _Unpickler_ResizeMemoList because its definition is unavailable 
_Unpickler_ResizeMemoList
1297
        return -1;
1298
    }
1299
    for (i = self->memo_size; i < new_size; i++)
gvn
                   
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_ResizeMemoList
gvn
                   
load of type i64 not eliminated in favor of load because it is clobbered by call 
_Unpickler_MemoPut
loop-vectorize
    
loop not vectorized: cannot identify array bounds 
_Unpickler_MemoPut
loop-vectorize
    
loop not vectorized 
_Unpickler_MemoPut
loop-unroll
    
unrolled loop by a factor of 8 with run-time trip count 
_Unpickler_MemoPut
1300
        self->memo[i] = NULL;
licm
              
failed to move load with loop-invariant address because the loop may invalidate its value 
_Unpickler_ResizeMemoList
gvn
              
load of type %struct._object** not eliminated because it is clobbered by store 
_Unpickler_ResizeMemoList
gvn
              
load eliminated by PRE 
_Unpickler_ResizeMemoList
1301
    self->memo_size = new_size;
1302
    return 0;
1303
}
1304
1305
/* Returns NULL if idx is out of bounds. */
1306
static PyObject *
1307
_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1308
{
1309
    if (idx < 0 || idx >= self->memo_size)
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load_binget
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load_long_binget
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load_get
licm
                                
hosting getelementptr 
load
licm
                                
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load
1310
        return NULL;
1311
1312
    return self->memo[idx];
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load_binget
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load_long_binget
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load_get
licm
                 
hosting getelementptr 
load
licm
                 
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by store 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by store 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object** not eliminated because it is clobbered by call 
load
1313
}
1314
1315
/* Returns -1 (with an exception set) on failure, 0 on success.
1316
   This takes its own reference to `value`. */
1317
static int
1318
_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1319
{
1320
    PyObject *old_item;
1321
1322
    if (idx >= self->memo_size) {
1323
        if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
inline
            
_Unpickler_ResizeMemoList can be inlined into _Unpickler_MemoPut with cost=-14880 (threshold=250) 
_Unpickler_MemoPut
inline
            
_Unpickler_ResizeMemoList inlined into _Unpickler_MemoPut 
_Unpickler_MemoPut
1324
            return -1;
1325
        assert(idx < self->memo_size);
1326
    }
1327
    Py_INCREF(value);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_MemoPut
1328
    old_item = self->memo[idx];
gvn
                     
load of type %struct._object** not eliminated because it is clobbered by store 
_Unpickler_MemoPut
1329
    self->memo[idx] = value;
1330
    if (old_item != NULL) {
1331
        Py_DECREF(old_item);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
_Unpickler_MemoPut
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
_Unpickler_MemoPut
1332
    }
1333
    else {
1334
        self->memo_len++;
gvn
                      
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_MemoPut
1335
    }
1336
    return 0;
1337
}
1338
1339
static PyObject **
1340
_Unpickler_NewMemo(Py_ssize_t new_size)
1341
{
1342
    PyObject **memo = PyMem_NEW(PyObject *, new_size);
inline
                      
PyMem_Malloc will not be inlined into _Unpickler_NewMemo because its definition is unavailable 
_Unpickler_NewMemo
1343
    if (memo == NULL) {
1344
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _Unpickler_NewMemo because its definition is unavailable 
_Unpickler_NewMemo
1345
        return NULL;
1346
    }
1347
    memset(memo, 0, new_size * sizeof(PyObject *));
1348
    return memo;
1349
}
1350
1351
/* Free the unpickler's memo, taking care to decref any items left in it. */
1352
static void
1353
_Unpickler_MemoCleanup(UnpicklerObject *self)
1354
{
1355
    Py_ssize_t i;
1356
    PyObject **memo = self->memo;
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by store 
Unpickler_set_memo
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_set_memo
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_set_memo
1357
1358
    if (self->memo == NULL)
1359
        return;
1360
    self->memo = NULL;
1361
    i = self->memo_size;
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_clear
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_set_memo
gvn
              
load of type i64 not eliminated because it is clobbered by call 
Unpickler_set_memo
1362
    while (--i >= 0) {
loop-vectorize
    
loop not vectorized 
Unpickler_dealloc
loop-vectorize
    
loop not vectorized 
Unpickler_clear
loop-vectorize
    
loop not vectorized 
Unpickler_set_memo
loop-vectorize
    
loop not vectorized 
_pickle_UnpicklerMemoProxy_clear
1363
        Py_XDECREF(memo[i]);
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Unpickler_dealloc
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Unpickler_clear
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
Unpickler_set_memo
loop-vectorize
        
loop not vectorized: control flow cannot be substituted for a select 
_pickle_UnpicklerMemoProxy_clear
1364
    }
1365
    PyMem_FREE(memo);
inline
    
PyMem_Free will not be inlined into _Unpickler_MemoCleanup because its definition is unavailable 
_Unpickler_MemoCleanup
1366
}
1367
1368
static UnpicklerObject *
1369
_Unpickler_New(void)
1370
{
1371
    UnpicklerObject *self;
1372
1373
    self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
inline
           
_PyObject_GC_New will not be inlined into _Unpickler_New because its definition is unavailable 
_Unpickler_New
1374
    if (self == NULL)
1375
        return NULL;
1376
1377
    self->pers_func = NULL;
1378
    self->input_buffer = NULL;
1379
    self->input_line = NULL;
1380
    self->input_len = 0;
1381
    self->next_read_idx = 0;
1382
    self->prefetched_idx = 0;
1383
    self->read = NULL;
1384
    self->readline = NULL;
1385
    self->peek = NULL;
1386
    self->encoding = NULL;
1387
    self->errors = NULL;
1388
    self->marks = NULL;
1389
    self->num_marks = 0;
1390
    self->marks_size = 0;
1391
    self->proto = 0;
1392
    self->fix_imports = 0;
1393
    memset(&self->buffer, 0, sizeof(Py_buffer));
1394
    self->memo_size = 32;
1395
    self->memo_len = 0;
1396
    self->memo = _Unpickler_NewMemo(self->memo_size);
inline
                 
_Unpickler_NewMemo can be inlined into _Unpickler_New with cost=45 (threshold=250) 
_Unpickler_New
inline
                 
_Unpickler_NewMemo inlined into _Unpickler_New 
_Unpickler_New
1397
    self->stack = (Pdata *)Pdata_New();
inline
                           
Pdata_New can be inlined into _Unpickler_New with cost=160 (threshold=250) 
_Unpickler_New
inline
                           
Pdata_New inlined into _Unpickler_New 
_Unpickler_New
1398
1399
    if (self->memo == NULL || self->stack == NULL) {
gvn
              
load of type %struct._object** not eliminated in favor of store because it is clobbered by call 
_Unpickler_New
gvn
              
load of type %struct._object** not eliminated in favor of store because it is clobbered by call 
_Unpickler_New
1400
        Py_DECREF(self);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_New
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_New
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_Unpickler_New
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_New
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_New
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_Unpickler_New
1401
        return NULL;
1402
    }
1403
1404
    return self;
1405
}
1406
1407
/* Returns -1 (with an exception set) on failure, 0 on success. This may
1408
   be called once on a freshly created Pickler. */
1409
static int
1410
_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1411
{
1412
    _Py_IDENTIFIER(peek);
1413
    _Py_IDENTIFIER(read);
1414
    _Py_IDENTIFIER(readline);
1415
1416
    self->peek = _PyObject_GetAttrId(file, &PyId_peek);
inline
                 
_PyObject_GetAttrId will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
1417
    if (self->peek == NULL) {
1418
        if (PyErr_ExceptionMatches(PyExc_AttributeError))
inline
            
PyErr_ExceptionMatches will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_SetInputStream
1419
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
1420
        else
1421
            return -1;
1422
    }
1423
    self->read = _PyObject_GetAttrId(file, &PyId_read);
inline
                 
_PyObject_GetAttrId will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
1424
    self->readline = _PyObject_GetAttrId(file, &PyId_readline);
inline
                     
_PyObject_GetAttrId will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
1425
    if (self->readline == NULL || self->read == NULL) {
gvn
                                        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
1426
        if (PyErr_ExceptionMatches(PyExc_AttributeError))
inline
            
PyErr_ExceptionMatches will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_SetInputStream
1427
            PyErr_SetString(PyExc_TypeError,
inline
            
PyErr_SetString will not be inlined into _Unpickler_SetInputStream because its definition is unavailable 
_Unpickler_SetInputStream
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
_Unpickler_SetInputStream
1428
                            "file must have 'read' and 'readline' attributes");
1429
        Py_CLEAR(self->read);
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
1430
        Py_CLEAR(self->readline);
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
1431
        Py_CLEAR(self->peek);
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputStream
1432
        return -1;
1433
    }
1434
    return 0;
1435
}
1436
1437
/* Returns -1 (with an exception set) on failure, 0 on success. This may
1438
   be called once on a freshly created Pickler. */
1439
static int
1440
_Unpickler_SetInputEncoding(UnpicklerObject *self,
1441
                            const char *encoding,
1442
                            const char *errors)
1443
{
1444
    if (encoding == NULL)
1445
        encoding = "ASCII";
1446
    if (errors == NULL)
1447
        errors = "strict";
1448
1449
    self->encoding = _PyMem_Strdup(encoding);
inline
                     
_PyMem_Strdup will not be inlined into _Unpickler_SetInputEncoding because its definition is unavailable 
_Unpickler_SetInputEncoding
1450
    self->errors = _PyMem_Strdup(errors);
inline
                   
_PyMem_Strdup will not be inlined into _Unpickler_SetInputEncoding because its definition is unavailable 
_Unpickler_SetInputEncoding
1451
    if (self->encoding == NULL || self->errors == NULL) {
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_Unpickler_SetInputEncoding
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_load_impl
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_load
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_loads_impl
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_loads
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_Unpickler___init___impl
gvn
              
load of type i8* not eliminated in favor of store because it is clobbered by call 
_pickle_Unpickler___init__
1452
        PyErr_NoMemory();
inline
        
PyErr_NoMemory will not be inlined into _Unpickler_SetInputEncoding because its definition is unavailable 
_Unpickler_SetInputEncoding
1453
        return -1;
1454
    }
1455
    return 0;
1456
}
1457
1458
/* Generate a GET opcode for an object stored in the memo. */
1459
static int
1460
memo_get(PicklerObject *self, PyObject *key)
1461
{
1462
    Py_ssize_t *value;
1463
    char pdata[30];
1464
    Py_ssize_t len;
1465
1466
    value = PyMemoTable_Get(self->memo, key);
inline
            
PyMemoTable_Get can be inlined into memo_get with cost=65 (threshold=250) 
memo_get
inline
            
PyMemoTable_Get inlined into memo_get 
memo_get
1467
    if (value == NULL)  {
1468
        PyErr_SetObject(PyExc_KeyError, key);
inline
        
PyErr_SetObject will not be inlined into memo_get because its definition is unavailable 
memo_get
1469
        return -1;
1470
    }
1471
1472
    if (!self->bin) {
1473
        pdata[0] = GET;
1474
        PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
inline
        
PyOS_snprintf will not be inlined into memo_get because its definition is unavailable 
memo_get
1475
                      "%" PY_FORMAT_SIZE_T "d\n", *value);
1476
        len = strlen(pdata);
inline
              
strlen will not be inlined into memo_get because its definition is unavailable 
memo_get
1477
    }
1478
    else {
1479
        if (*value < 256) {
1480
            pdata[0] = BINGET;
1481
            pdata[1] = (unsigned char)(*value & 0xff);
gvn
                                       
load of type i64 eliminated in favor of load 
memo_get
1482
            len = 2;
1483
        }
1484
        else if ((size_t)*value <= 0xffffffffUL) {
1485
            pdata[0] = LONG_BINGET;
1486
            pdata[1] = (unsigned char)(*value & 0xff);
gvn
                                       
load of type i64 eliminated in favor of load 
memo_get
1487
            pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1488
            pdata[3] = (unsigned char)((*value >> 16) & 0xff);
gvn
                                        
load of type i64 eliminated in favor of load 
memo_get
1489
            pdata[4] = (unsigned char)((*value >> 24) & 0xff);
1490
            len = 5;
1491
        }
1492
        else { /* unlikely */
1493
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into memo_get with cost=40 (threshold=375) 
memo_get
inline
                              
_Pickle_GetGlobalState inlined into memo_get 
memo_get
1494
            PyErr_SetString(st->PicklingError,
inline
            
PyErr_SetString will not be inlined into memo_get because its definition is unavailable 
memo_get
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
memo_get
1495
                            "memo id too large for LONG_BINGET");
1496
            return -1;
1497
        }
1498
    }
1499
1500
    if (_Pickler_Write(self, pdata, len) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
memo_get
inline
        
_Pickler_Write will not be inlined into memo_get 
memo_get
1501
        return -1;
1502
1503
    return 0;
1504
}
1505
1506
/* Store an object in the memo, assign it a new unique ID based on the number
1507
   of objects currently stored in the memo and generate a PUT opcode. */
1508
static int
1509
memo_put(PicklerObject *self, PyObject *obj)
1510
{
1511
    char pdata[30];
1512
    Py_ssize_t len;
1513
    Py_ssize_t idx;
1514
1515
    const char memoize_op = MEMOIZE;
1516
1517
    if (self->fast)
1518
        return 0;
1519
1520
    idx = PyMemoTable_Size(self->memo);
inline
          
PyMemoTable_Size can be inlined into memo_put with cost=-15035 (threshold=375) 
memo_put
inline
          
PyMemoTable_Size inlined into memo_put 
memo_put
1521
    if (PyMemoTable_Set(self->memo, obj, idx) < 0)
inline
        
PyMemoTable_Set too costly to inline (cost=545, threshold=250) 
memo_put
inline
        
PyMemoTable_Set will not be inlined into memo_put 
memo_put
1522
        return -1;
1523
1524
    if (self->proto >= 4) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
memo_put
1525
        if (_Pickler_Write(self, &memoize_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into memo_put with cost=230 (threshold=250) 
memo_put
inline
            
_Pickler_Write inlined into memo_put 
memo_put
1526
            return -1;
1527
        return 0;
1528
    }
1529
    else if (!self->bin) {
gvn
                    
load of type i32 not eliminated because it is clobbered by call 
memo_put
1530
        pdata[0] = PUT;
1531
        PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
inline
        
PyOS_snprintf will not be inlined into memo_put because its definition is unavailable 
memo_put
1532
                      "%" PY_FORMAT_SIZE_T "d\n", idx);
1533
        len = strlen(pdata);
inline
              
strlen will not be inlined into memo_put because its definition is unavailable 
memo_put
1534
    }
1535
    else {
1536
        if (idx < 256) {
1537
            pdata[0] = BINPUT;
1538
            pdata[1] = (unsigned char)idx;
1539
            len = 2;
1540
        }
1541
        else if ((size_t)idx <= 0xffffffffUL) {
1542
            pdata[0] = LONG_BINPUT;
1543
            pdata[1] = (unsigned char)(idx & 0xff);
1544
            pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1545
            pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1546
            pdata[4] = (unsigned char)((idx >> 24) & 0xff);
1547
            len = 5;
1548
        }
1549
        else { /* unlikely */
1550
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into memo_put with cost=40 (threshold=375) 
memo_put
inline
                              
_Pickle_GetGlobalState inlined into memo_put 
memo_put
1551
            PyErr_SetString(st->PicklingError,
inline
            
PyErr_SetString will not be inlined into memo_put because its definition is unavailable 
memo_put
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
memo_put
1552
                            "memo id too large for LONG_BINPUT");
1553
            return -1;
1554
        }
1555
    }
1556
    if (_Pickler_Write(self, pdata, len) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
memo_put
inline
        
_Pickler_Write will not be inlined into memo_put 
memo_put
1557
        return -1;
1558
1559
    return 0;
1560
}
1561
1562
static PyObject *
1563
get_dotted_path(PyObject *obj, PyObject *name) {
1564
    _Py_static_string(PyId_dot, ".");
1565
    _Py_static_string(PyId_locals, "<locals>");
1566
    PyObject *dotted_path;
1567
    Py_ssize_t i, n;
1568
1569
    dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
inline
                                        
_PyUnicode_FromId will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
inline
                  
PyUnicode_Split will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
1570
    if (dotted_path == NULL)
1571
        return NULL;
1572
    n = PyList_GET_SIZE(dotted_path);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
get_dotted_path
1573
    assert(n >= 1);
1574
    for (i = 0; i < n; i++) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
get_dotted_path
loop-vectorize
    
loop not vectorized 
get_dotted_path
1575
        PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
licm
                            
hosting getelementptr 
get_dotted_path
licm
                            
hosting bitcast 
get_dotted_path
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
get_dotted_path
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
get_dotted_path
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
get_dotted_path
gvn
                            
load of type %struct._object** not eliminated because it is clobbered by call 
get_dotted_path
1576
        PyObject *result = PyUnicode_RichCompare(
inline
                           
PyUnicode_RichCompare will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
1577
            subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
inline
                     
_PyUnicode_FromId will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
1578
        int is_equal = (result == Py_True);
1579
        assert(PyBool_Check(result));
1580
        Py_DECREF(result);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
get_dotted_path
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_dotted_path
1581
        if (is_equal) {
1582
            if (obj == NULL)
1583
                PyErr_Format(PyExc_AttributeError,
inline
                
PyErr_Format will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
1584
                             "Can't pickle local object %R", name);
1585
            else
1586
                PyErr_Format(PyExc_AttributeError,
inline
                
PyErr_Format will not be inlined into get_dotted_path because its definition is unavailable 
get_dotted_path
1587
                             "Can't pickle local attribute %R on %R", name, obj);
1588
            Py_DECREF(dotted_path);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
get_dotted_path
gvn
            
load of type i64 not eliminated because it is clobbered by call 
get_dotted_path
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_dotted_path
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_dotted_path
1589
            return NULL;
1590
        }
1591
    }
1592
    return dotted_path;
1593
}
1594
1595
static PyObject *
1596
get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
1597
{
1598
    Py_ssize_t i, n;
1599
    PyObject *parent = NULL;
1600
1601
    assert(PyList_CheckExact(names));
1602
    Py_INCREF(obj);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
getattribute
1603
    n = PyList_GET_SIZE(names);
licm
        
hosting getelementptr 
whichmodule
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 eliminated in favor of load 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
1604
    for (i = 0; i < n; i++) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
save_global
loop-vectorize
    
loop not vectorized 
save_global
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
getattribute
loop-vectorize
    
loop not vectorized 
getattribute
1605
        PyObject *name = PyList_GET_ITEM(names, i);
licm
                         
hosting getelementptr 
get_deep_attribute
licm
                         
hosting bitcast 
get_deep_attribute
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
get_deep_attribute
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
get_deep_attribute
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
whichmodule
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
whichmodule
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
whichmodule
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
whichmodule
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object** not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                         
load eliminated by PRE 
save_global
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
getattribute
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
getattribute
gvn
                         
load of type %struct._object** not eliminated because it is clobbered by call 
getattribute
loop-vectorize
                         
loop not vectorized: loop control flow is not understood by vectorizer 
save_global
loop-vectorize
                         
loop not vectorized 
save_global
1606
        Py_XDECREF(parent);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
get_deep_attribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_deep_attribute
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
1607
        parent = obj;
1608
        obj = PyObject_GetAttr(parent, name);
inline
              
PyObject_GetAttr will not be inlined into get_deep_attribute because its definition is unavailable 
get_deep_attribute
1609
        if (obj == NULL) {
1610
            Py_DECREF(parent);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
get_deep_attribute
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_deep_attribute
gvn
            
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
1611
            return NULL;
1612
        }
1613
    }
1614
    if (pparent != NULL)
1615
        *pparent = parent;
1616
    else
1617
        Py_XDECREF(parent);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
get_deep_attribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
get_deep_attribute
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
1618
    return obj;
1619
}
1620
1621
static void
1622
reformat_attribute_error(PyObject *obj, PyObject *name)
1623
{
1624
    if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
inline
        
PyErr_ExceptionMatches will not be inlined into reformat_attribute_error because its definition is unavailable 
reformat_attribute_error
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
getattribute
1625
        PyErr_Clear();
inline
        
PyErr_Clear will not be inlined into reformat_attribute_error because its definition is unavailable 
reformat_attribute_error
1626
        PyErr_Format(PyExc_AttributeError,
inline
        
PyErr_Format will not be inlined into reformat_attribute_error because its definition is unavailable 
reformat_attribute_error
gvn
                     
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
reformat_attribute_error
gvn
                     
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
getattribute
1627
                     "Can't get attribute %R on %R", name, obj);
1628
    }
1629
}
1630
1631
1632
static PyObject *
1633
getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1634
{
1635
    PyObject *dotted_path, *attr;
1636
1637
    if (allow_qualname) {
1638
        dotted_path = get_dotted_path(obj, name);
inline
                      
get_dotted_path too costly to inline (cost=385, threshold=250) 
getattribute
inline
                      
get_dotted_path will not be inlined into getattribute 
getattribute
1639
        if (dotted_path == NULL)
1640
            return NULL;
1641
        attr = get_deep_attribute(obj, dotted_path, NULL);
inline
               
get_deep_attribute can be inlined into getattribute with cost=-14780 (threshold=250) 
getattribute
inline
               
get_deep_attribute inlined into getattribute 
getattribute
1642
        Py_DECREF(dotted_path);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
getattribute
gvn
        
load of type i64 not eliminated because it is clobbered by store 
getattribute
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type i64 not eliminated because it is clobbered by store 
getattribute
gvn
        
load of type i64 not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
getattribute
1643
    }
1644
    else
1645
        attr = PyObject_GetAttr(obj, name);
inline
               
PyObject_GetAttr will not be inlined into getattribute because its definition is unavailable 
getattribute
1646
    if (attr == NULL)
1647
        reformat_attribute_error(obj, name);
inline
        
reformat_attribute_error can be inlined into getattribute with cost=-14905 (threshold=250) 
getattribute
inline
        
reformat_attribute_error inlined into getattribute 
getattribute
1648
    return attr;
1649
}
1650
1651
static PyObject *
1652
whichmodule(PyObject *global, PyObject *dotted_path)
1653
{
1654
    PyObject *module_name;
1655
    PyObject *modules_dict;
1656
    PyObject *module;
1657
    Py_ssize_t i;
1658
    _Py_IDENTIFIER(__module__);
1659
    _Py_IDENTIFIER(modules);
1660
    _Py_IDENTIFIER(__main__);
1661
1662
    module_name = _PyObject_GetAttrId(global, &PyId___module__);
inline
                  
_PyObject_GetAttrId will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1663
1664
    if (module_name == NULL) {
1665
        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
inline
             
PyErr_ExceptionMatches will not be inlined into whichmodule because its definition is unavailable 
whichmodule
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
1666
            return NULL;
1667
        PyErr_Clear();
inline
        
PyErr_Clear will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1668
    }
1669
    else {
1670
        /* In some rare cases (e.g., bound methods of extension types),
1671
           __module__ can be None. If it is so, then search sys.modules for
1672
           the module of global. */
1673
        if (module_name != Py_None)
1674
            return module_name;
1675
        Py_CLEAR(module_name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
1676
    }
1677
    assert(module_name == NULL);
1678
1679
    /* Fallback on walking sys.modules */
1680
    modules_dict = _PySys_GetObjectId(&PyId_modules);
inline
                   
_PySys_GetObjectId will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1681
    if (modules_dict == NULL) {
1682
        PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
inline
        
PyErr_SetString will not be inlined into whichmodule because its definition is unavailable 
whichmodule
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
1683
        return NULL;
1684
    }
1685
1686
    i = 0;
1687
    while (PyDict_Next(modules_dict, &i, &module_name, &module)) {
inline
           
PyDict_Next will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1688
        PyObject *candidate;
1689
        if (PyUnicode_Check(module_name) &&
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
whichmodule
gvn
            
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
whichmodule
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
            
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_global
1690
            _PyUnicode_EqualToASCIIString(module_name, "__main__"))
inline
            
_PyUnicode_EqualToASCIIString will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1691
            continue;
1692
        if (module == Py_None)
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
whichmodule
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
1693
            continue;
1694
1695
        candidate = get_deep_attribute(module, dotted_path, NULL);
inline
                    
get_deep_attribute can be inlined into whichmodule with cost=220 (threshold=250) 
whichmodule
inline
                    
get_deep_attribute inlined into whichmodule 
whichmodule
1696
        if (candidate == NULL) {
1697
            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
inline
                 
PyErr_ExceptionMatches will not be inlined into whichmodule because its definition is unavailable 
whichmodule
licm
                                        
failed to move load with loop-invariant address because the loop may invalidate its value 
whichmodule
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
licm
                                        
failed to move load with loop-invariant address because the loop may invalidate its value 
save_global
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
1698
                return NULL;
1699
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1700
            continue;
1701
        }
1702
1703
        if (candidate == global) {
1704
            Py_INCREF(module_name);
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
1705
            Py_DECREF(candidate);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
whichmodule
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
whichmodule
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
1706
            return module_name;
gvn
                   
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
whichmodule
gvn
                   
load eliminated by PRE 
whichmodule
1707
        }
1708
        Py_DECREF(candidate);
1709
    }
1710
1711
    /* If no module is found, use __main__. */
1712
    module_name = _PyUnicode_FromId(&PyId___main__);
inline
                  
_PyUnicode_FromId will not be inlined into whichmodule because its definition is unavailable 
whichmodule
1713
    Py_INCREF(module_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
whichmodule
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
1714
    return module_name;
gvn
           
load of type %struct._object* eliminated in favor of call 
whichmodule
1715
}
1716
1717
/* fast_save_enter() and fast_save_leave() are guards against recursive
1718
   objects when Pickler is used with the "fast mode" (i.e., with object
1719
   memoization disabled). If the nesting of a list or dict object exceed
1720
   FAST_NESTING_LIMIT, these guards will start keeping an internal
1721
   reference to the seen list or dict objects and check whether these objects
1722
   are recursive. These are not strictly necessary, since save() has a
1723
   hard-coded recursion limit, but they give a nicer error message than the
1724
   typical RuntimeError. */
1725
static int
1726
fast_save_enter(PicklerObject *self, PyObject *obj)
1727
{
1728
    /* if fast_nesting < 0, we're doing an error exit. */
1729
    if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1730
        PyObject *key = NULL;
1731
        if (self->fast_memo == NULL) {
1732
            self->fast_memo = PyDict_New();
inline
                              
PyDict_New will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
1733
            if (self->fast_memo == NULL) {
1734
                self->fast_nesting = -1;
1735
                return 0;
1736
            }
1737
        }
1738
        key = PyLong_FromVoidPtr(obj);
inline
              
PyLong_FromVoidPtr will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
1739
        if (key == NULL)
1740
            return 0;
1741
        if (PyDict_GetItemWithError(self->fast_memo, key)) {
inline
            
PyDict_GetItemWithError will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
gvn
                                          
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fast_save_enter
1742
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
fast_save_enter
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_enter
1743
            PyErr_Format(PyExc_ValueError,
inline
            
PyErr_Format will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fast_save_enter
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fast_save_enter
1744
                         "fast mode: can't pickle cyclic objects "
1745
                         "including object type %.200s at %p",
1746
                         obj->ob_type->tp_name, obj);
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_enter
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_enter
1747
            self->fast_nesting = -1;
1748
            return 0;
1749
        }
1750
        if (PyErr_Occurred()) {
inline
            
PyErr_Occurred will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
1751
            return 0;
1752
        }
1753
        if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
inline
            
PyDict_SetItem will not be inlined into fast_save_enter because its definition is unavailable 
fast_save_enter
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
fast_save_enter
1754
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
fast_save_enter
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_enter
1755
            self->fast_nesting = -1;
1756
            return 0;
1757
        }
1758
        Py_DECREF(key);
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_enter
1759
    }
1760
    return 1;
1761
}
1762
1763
static int
1764
fast_save_leave(PicklerObject *self, PyObject *obj)
1765
{
1766
    if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
1767
        PyObject *key = PyLong_FromVoidPtr(obj);
inline
                        
PyLong_FromVoidPtr will not be inlined into fast_save_leave because its definition is unavailable 
fast_save_leave
1768
        if (key == NULL)
1769
            return 0;
1770
        if (PyDict_DelItem(self->fast_memo, key) < 0) {
inline
            
PyDict_DelItem will not be inlined into fast_save_leave because its definition is unavailable 
fast_save_leave
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
fast_save_leave
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
save_list
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
save_dict
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
save
1771
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
fast_save_leave
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_leave
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_list
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
1772
            return 0;
1773
        }
1774
        Py_DECREF(key);
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fast_save_leave
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_list
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
1775
    }
1776
    return 1;
1777
}
1778
1779
static int
1780
save_none(PicklerObject *self, PyObject *obj)
1781
{
1782
    const char none_op = NONE;
1783
    if (_Pickler_Write(self, &none_op, 1) < 0)
inline
        
_Pickler_Write can be inlined into save_none with cost=230 (threshold=250) 
save_none
inline
        
_Pickler_Write inlined into save_none 
save_none
1784
        return -1;
1785
1786
    return 0;
1787
}
1788
1789
static int
1790
save_bool(PicklerObject *self, PyObject *obj)
1791
{
1792
    if (self->proto >= 2) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
1793
        const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
1794
        if (_Pickler_Write(self, &bool_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_bool with cost=230 (threshold=250) 
save_bool
inline
            
_Pickler_Write inlined into save_bool 
save_bool
1795
            return -1;
1796
    }
1797
    else {
1798
        /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1799
         * so that unpicklers written before bools were introduced unpickle them
1800
         * as ints, but unpicklers after can recognize that bools were intended.
1801
         * Note that protocol 2 added direct ways to pickle bools.
1802
         */
1803
        const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1804
        if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
inline
            
_Pickler_Write can be inlined into save_bool with cost=230 (threshold=250) 
save_bool
inline
            
_Pickler_Write inlined into save_bool 
save_bool
1805
            return -1;
1806
    }
1807
    return 0;
1808
}
1809
1810
static int
1811
save_long(PicklerObject *self, PyObject *obj)
1812
{
1813
    PyObject *repr = NULL;
1814
    Py_ssize_t size;
1815
    long val;
1816
    int status = 0;
1817
1818
    const char long_op = LONG;
1819
1820
    val= PyLong_AsLong(obj);
inline
         
PyLong_AsLong will not be inlined into save_long because its definition is unavailable 
save_long
1821
    if (val == -1 && PyErr_Occurred()) {
inline
                     
PyErr_Occurred will not be inlined into save_long because its definition is unavailable 
save_long
1822
        /* out of range for int pickling */
1823
        PyErr_Clear();
inline
        
PyErr_Clear will not be inlined into save_long because its definition is unavailable 
save_long
1824
    }
1825
    else if (self->bin &&
gvn
                   
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
                   
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
                   
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                   
load of type i32 not eliminated because it is clobbered by call 
save
1826
             (sizeof(long) <= 4 ||
1827
              (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
1828
        /* result fits in a signed 4-byte integer.
1829
1830
           Note: we can't use -0x80000000L in the above condition because some
1831
           compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1832
           before applying the unary minus when sizeof(long) <= 4. The
1833
           resulting value stays unsigned which is commonly not what we want,
1834
           so MSVC happily warns us about it.  However, that result would have
1835
           been fine because we guard for sizeof(long) <= 4 which turns the
1836
           condition true in that particular case. */
1837
        char pdata[32];
1838
        Py_ssize_t len = 0;
1839
1840
        pdata[1] = (unsigned char)(val & 0xff);
1841
        pdata[2] = (unsigned char)((val >> 8) & 0xff);
1842
        pdata[3] = (unsigned char)((val >> 16) & 0xff);
1843
        pdata[4] = (unsigned char)((val >> 24) & 0xff);
1844
1845
        if ((pdata[4] == 0) && (pdata[3] == 0)) {
1846
            if (pdata[2] == 0) {
gvn
                
load of type i8 eliminated in favor of trunc 
save_long
1847
                pdata[0] = BININT1;
1848
                len = 2;
1849
            }
1850
            else {
1851
                pdata[0] = BININT2;
1852
                len = 3;
1853
            }
1854
        }
1855
        else {
1856
            pdata[0] = BININT;
1857
            len = 5;
1858
        }
1859
1860
        if (_Pickler_Write(self, pdata, len) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_long
inline
            
_Pickler_Write will not be inlined into save_long 
save_long
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
1861
            return -1;
1862
1863
        return 0;
1864
    }
1865
1866
    if (self->proto >= 2) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_long
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
1867
        /* Linear-time pickling. */
1868
        size_t nbits;
1869
        size_t nbytes;
1870
        unsigned char *pdata;
1871
        char header[5];
1872
        int i;
1873
        int sign = _PyLong_Sign(obj);
inline
                   
_PyLong_Sign will not be inlined into save_long because its definition is unavailable 
save_long
1874
1875
        if (sign == 0) {
1876
            header[0] = LONG1;
1877
            header[1] = 0;      /* It's 0 -- an empty bytestring. */
1878
            if (_Pickler_Write(self, header, 2) < 0)
inline
                
_Pickler_Write can be inlined into save_long with cost=230 (threshold=250) 
save_long
inline
                
_Pickler_Write inlined into save_long 
save_long
1879
                goto error;
1880
            return 0;
1881
        }
1882
        nbits = _PyLong_NumBits(obj);
inline
                
_PyLong_NumBits will not be inlined into save_long because its definition is unavailable 
save_long
1883
        if (nbits == (size_t)-1 && PyErr_Occurred())
inline
                                   
PyErr_Occurred will not be inlined into save_long because its definition is unavailable 
save_long
1884
            goto error;
1885
        /* How many bytes do we need?  There are nbits >> 3 full
1886
         * bytes of data, and nbits & 7 leftover bits.  If there
1887
         * are any leftover bits, then we clearly need another
1888
         * byte.  Wnat's not so obvious is that we *probably*
1889
         * need another byte even if there aren't any leftovers:
1890
         * the most-significant bit of the most-significant byte
1891
         * acts like a sign bit, and it's usually got a sense
1892
         * opposite of the one we need.  The exception is ints
1893
         * of the form -(2**(8*j-1)) for j > 0.  Such an int is
1894
         * its own 256's-complement, so has the right sign bit
1895
         * even without the extra byte.  That's a pain to check
1896
         * for in advance, though, so we always grab an extra
1897
         * byte at the start, and cut it back later if possible.
1898
         */
1899
        nbytes = (nbits >> 3) + 1;
1900
        if (nbytes > 0x7fffffffL) {
1901
            PyErr_SetString(PyExc_OverflowError,
inline
            
PyErr_SetString will not be inlined into save_long because its definition is unavailable 
save_long
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_long
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_long
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
1902
                            "int too large to pickle");
1903
            goto error;
1904
        }
1905
        repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
inline
               
PyBytes_FromStringAndSize will not be inlined into save_long because its definition is unavailable 
save_long
1906
        if (repr == NULL)
1907
            goto error;
1908
        pdata = (unsigned char *)PyBytes_AS_STRING(repr);
1909
        i = _PyLong_AsByteArray((PyLongObject *)obj,
inline
            
_PyLong_AsByteArray will not be inlined into save_long because its definition is unavailable 
save_long
1910
                                pdata, nbytes,
1911
                                1 /* little endian */ , 1 /* signed */ );
1912
        if (i < 0)
1913
            goto error;
1914
        /* If the int is negative, this may be a byte more than
1915
         * needed.  This is so iff the MSB is all redundant sign
1916
         * bits.
1917
         */
1918
        if (sign < 0 &&
1919
            nbytes > 1 &&
1920
            pdata[nbytes - 1] == 0xff &&
gvn
            
load of type i8 not eliminated because it is clobbered by call 
save_long
gvn
            
load of type i8 not eliminated because it is clobbered by call 
save
1921
            (pdata[nbytes - 2] & 0x80) != 0) {
gvn
             
load of type i8 not eliminated because it is clobbered by call 
save_long
gvn
             
load of type i8 not eliminated because it is clobbered by call 
save
1922
            nbytes--;
1923
        }
1924
1925
        if (nbytes < 256) {
1926
            header[0] = LONG1;
1927
            header[1] = (unsigned char)nbytes;
1928
            size = 2;
1929
        }
1930
        else {
1931
            header[0] = LONG4;
1932
            size = (Py_ssize_t) nbytes;
1933
            for (i = 1; i < 5; i++) {
loop-unroll
            
completely unrolled loop with 4 iterations 
save_long
1934
                header[i] = (unsigned char)(size & 0xff);
licm
                                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_long
1935
                size >>= 8;
licm
                     
Moving accesses to memory location out of the loop 
save_long
1936
            }
1937
            size = 5;
1938
        }
1939
        if (_Pickler_Write(self, header, size) < 0 ||
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_long
inline
            
_Pickler_Write will not be inlined into save_long 
save_long
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
1940
            _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_long
inline
            
_Pickler_Write will not be inlined into save_long 
save_long
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
1941
            goto error;
1942
    }
1943
    else {
1944
        char *string;
1945
1946
        /* proto < 2: write the repr and newline.  This is quadratic-time (in
1947
           the number of digits), in both directions.  We add a trailing 'L'
1948
           to the repr, for compatibility with Python 2.x. */
1949
1950
        repr = PyObject_Repr(obj);
inline
               
PyObject_Repr will not be inlined into save_long because its definition is unavailable 
save_long
1951
        if (repr == NULL)
1952
            goto error;
1953
1954
        string = PyUnicode_AsUTF8AndSize(repr, &size);
inline
                 
PyUnicode_AsUTF8AndSize will not be inlined into save_long because its definition is unavailable 
save_long
1955
        if (string == NULL)
1956
            goto error;
1957
1958
        if (_Pickler_Write(self, &long_op, 1) < 0 ||
inline
            
_Pickler_Write can be inlined into save_long with cost=230 (threshold=250) 
save_long
inline
            
_Pickler_Write inlined into save_long 
save_long
1959
            _Pickler_Write(self, string, size) < 0 ||
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_long
inline
            
_Pickler_Write will not be inlined into save_long 
save_long
gvn
                                         
load of type i64 not eliminated because it is clobbered by store 
save_long
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
gvn
                                         
load of type i64 not eliminated because it is clobbered by store 
save
1960
            _Pickler_Write(self, "L\n", 2) < 0)
inline
            
_Pickler_Write can be inlined into save_long with cost=230 (threshold=250) 
save_long
inline
            
_Pickler_Write inlined into save_long 
save_long
1961
            goto error;
1962
    }
1963
1964
    if (0) {
1965
  error:
1966
      status = -1;
1967
    }
1968
    Py_XDECREF(repr);
1969
1970
    return status;
1971
}
1972
1973
static int
1974
save_float(PicklerObject *self, PyObject *obj)
1975
{
1976
    double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by store 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
gvn
               
load of type double not eliminated because it is clobbered by call 
save
1977
1978
    if (self->bin) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
1979
        char pdata[9];
1980
        pdata[0] = BINFLOAT;
1981
        if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
inline
            
_PyFloat_Pack8 will not be inlined into save_float because its definition is unavailable 
save_float
1982
            return -1;
1983
        if (_Pickler_Write(self, pdata, 9) < 0)
inline
            
_Pickler_Write can be inlined into save_float with cost=200 (threshold=250) 
save_float
inline
            
_Pickler_Write inlined into save_float 
save_float
1984
            return -1;
1985
   }
1986
    else {
1987
        int result = -1;
1988
        char *buf = NULL;
1989
        char op = FLOAT;
1990
1991
        if (_Pickler_Write(self, &op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_float with cost=230 (threshold=250) 
save_float
inline
            
_Pickler_Write inlined into save_float 
save_float
1992
            goto done;
1993
1994
        buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
inline
              
PyOS_double_to_string will not be inlined into save_float because its definition is unavailable 
save_float
1995
        if (!buf) {
1996
            PyErr_NoMemory();
inline
            
PyErr_NoMemory will not be inlined into save_float because its definition is unavailable 
save_float
1997
            goto done;
1998
        }
1999
2000
        if (_Pickler_Write(self, buf, strlen(buf)) < 0)
inline
                                      
strlen will not be inlined into save_float because its definition is unavailable 
save_float
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_float
inline
            
_Pickler_Write will not be inlined into save_float 
save_float
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
2001
            goto done;
2002
2003
        if (_Pickler_Write(self, "\n", 1) < 0)
inline
            
_Pickler_Write can be inlined into save_float with cost=230 (threshold=250) 
save_float
inline
            
_Pickler_Write inlined into save_float 
save_float
2004
            goto done;
2005
2006
        result = 0;
2007
done:
2008
        PyMem_Free(buf);
inline
        
PyMem_Free will not be inlined into save_float because its definition is unavailable 
save_float
2009
        return result;
2010
    }
2011
2012
    return 0;
2013
}
2014
2015
static int
2016
save_bytes(PicklerObject *self, PyObject *obj)
2017
{
2018
    if (self->proto < 3) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2019
        /* Older pickle protocols do not have an opcode for pickling bytes
2020
           objects. Therefore, we need to fake the copy protocol (i.e.,
2021
           the __reduce__ method) to permit bytes object unpickling.
2022
2023
           Here we use a hack to be compatible with Python 2. Since in Python
2024
           2 'bytes' is just an alias for 'str' (which has different
2025
           parameters than the actual bytes object), we use codecs.encode
2026
           to create the appropriate 'str' object when unpickled using
2027
           Python 2 *and* the appropriate 'bytes' object when unpickled
2028
           using Python 3. Again this is a hack and we don't need to do this
2029
           with newer protocols. */
2030
        PyObject *reduce_value = NULL;
2031
        int status;
2032
2033
        if (PyBytes_GET_SIZE(obj) == 0) {
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
2034
            reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
inline
                           
Py_BuildValue will not be inlined into save_bytes because its definition is unavailable 
save_bytes
2035
        }
2036
        else {
2037
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into save_bytes with cost=40 (threshold=375) 
save_bytes
inline
                              
_Pickle_GetGlobalState inlined into save_bytes 
save_bytes
2038
            PyObject *unicode_str =
2039
                PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
inline
                
PyUnicode_DecodeLatin1 will not be inlined into save_bytes because its definition is unavailable 
save_bytes
2040
                                       PyBytes_GET_SIZE(obj),
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_bytes
gvn
                                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
2041
                                       "strict");
2042
            _Py_IDENTIFIER(latin1);
2043
2044
            if (unicode_str == NULL)
2045
                return -1;
2046
            reduce_value = Py_BuildValue("(O(OO))",
inline
                           
Py_BuildValue will not be inlined into save_bytes because its definition is unavailable 
save_bytes
2047
                                         st->codecs_encode, unicode_str,
gvn
                                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_bytes
gvn
                                             
load of type %struct._object* not eliminated because it is clobbered by call 
save
2048
                                         _PyUnicode_FromId(&PyId_latin1));
inline
                                         
_PyUnicode_FromId will not be inlined into save_bytes because its definition is unavailable 
save_bytes
2049
            Py_DECREF(unicode_str);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_bytes
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_bytes
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2050
        }
2051
2052
        if (reduce_value == NULL)
2053
            return -1;
2054
2055
        /* save_reduce() will memoize the object automatically. */
2056
        status = save_reduce(self, reduce_value, obj);
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save_bytes
inline
                 
save_reduce will not be inlined into save_bytes 
save_bytes
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save
inline
                 
save_reduce will not be inlined into save 
save
2057
        Py_DECREF(reduce_value);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_bytes
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_bytes
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2058
        return status;
2059
    }
2060
    else {
2061
        Py_ssize_t size;
2062
        char header[9];
2063
        Py_ssize_t len;
2064
2065
        size = PyBytes_GET_SIZE(obj);
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by store 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
2066
        if (size < 0)
2067
            return -1;
2068
2069
        if (size <= 0xff) {
2070
            header[0] = SHORT_BINBYTES;
2071
            header[1] = (unsigned char)size;
2072
            len = 2;
2073
        }
2074
        else if ((size_t)size <= 0xffffffffUL) {
2075
            header[0] = BINBYTES;
2076
            header[1] = (unsigned char)(size & 0xff);
2077
            header[2] = (unsigned char)((size >> 8) & 0xff);
2078
            header[3] = (unsigned char)((size >> 16) & 0xff);
2079
            header[4] = (unsigned char)((size >> 24) & 0xff);
2080
            len = 5;
2081
        }
2082
        else if (self->proto >= 4) {
2083
            header[0] = BINBYTES8;
2084
            _write_size64(header + 1, size);
inline
            
_write_size64 can be inlined into save_bytes with cost=-15005 (threshold=375) 
save_bytes
inline
            
_write_size64 inlined into save_bytes 
save_bytes
2085
            len = 9;
2086
        }
2087
        else {
2088
            PyErr_SetString(PyExc_OverflowError,
inline
            
PyErr_SetString will not be inlined into save_bytes because its definition is unavailable 
save_bytes
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by store 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
2089
                            "cannot serialize a bytes object larger than 4 GiB");
2090
            return -1;          /* string too large */
2091
        }
2092
2093
        if (_Pickler_Write(self, header, len) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_bytes
inline
            
_Pickler_Write will not be inlined into save_bytes 
save_bytes
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
2094
            return -1;
2095
2096
        if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_bytes
inline
            
_Pickler_Write will not be inlined into save_bytes 
save_bytes
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
2097
            return -1;
2098
2099
        if (memo_put(self, obj) < 0)
inline
            
memo_put too costly to inline (cost=630, threshold=625) 
save_bytes
inline
            
memo_put will not be inlined into save_bytes 
save_bytes
inline
            
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
            
memo_put will not be inlined into save 
save
2100
            return -1;
2101
2102
        return 0;
2103
    }
2104
}
2105
2106
/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2107
   backslash and newline characters to \uXXXX escapes. */
2108
static PyObject *
2109
raw_unicode_escape(PyObject *obj)
2110
{
2111
    char *p;
2112
    Py_ssize_t i, size;
2113
    void *data;
2114
    unsigned int kind;
2115
    _PyBytesWriter writer;
2116
2117
    if (PyUnicode_READY(obj))
inline
        
_PyUnicode_Ready will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
gvn
        
load of type i32 not eliminated because it is clobbered by store 
save
gvn
        
load of type i32 not eliminated because it is clobbered by call 
save
gvn
        
load of type i32 not eliminated because it is clobbered by call 
save
gvn
        
load of type i32 not eliminated because it is clobbered by store 
save
2118
        return NULL;
2119
2120
    _PyBytesWriter_Init(&writer);
inline
    
_PyBytesWriter_Init will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2121
2122
    size = PyUnicode_GET_LENGTH(obj);
gvn
           
load of type i64 not eliminated because it is clobbered by call 
raw_unicode_escape
gvn
           
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
           
load of type i64 not eliminated because it is clobbered by call 
save
2123
    data = PyUnicode_DATA(obj);
gvn
           
load of type i32 not eliminated in favor of load because it is clobbered by call 
raw_unicode_escape
gvn
           
load of type i8* not eliminated because it is clobbered by call 
raw_unicode_escape
gvn
           
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_unicode
gvn
           
load of type i8* not eliminated because it is clobbered by call 
save_unicode
gvn
           
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
           
load of type i8* not eliminated because it is clobbered by call 
save
2124
    kind = PyUnicode_KIND(obj);
gvn
           
load of type i32 eliminated in favor of load 
raw_unicode_escape
2125
2126
    p = _PyBytesWriter_Alloc(&writer, size);
inline
        
_PyBytesWriter_Alloc will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2127
    if (p == NULL)
2128
        goto error;
2129
    writer.overallocate = 1;
2130
2131
    for (i=0; i < size; i++) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
    
loop not vectorized 
save
2132
        Py_UCS4 ch = PyUnicode_READ(kind, data, i);
licm
                     
hosting trunc 
raw_unicode_escape
licm
                     
hosting bitcast 
raw_unicode_escape
gvn
                     
load of type i32 not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                     
load of type i16 not eliminated because it is clobbered by call 
raw_unicode_escape
gvn
                     
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                     
hosting icmp 
raw_unicode_escape
gvn
                     
load of type i16 not eliminated because it is clobbered by call 
save_unicode
gvn
                     
load of type i8 not eliminated because it is clobbered by store 
save_unicode
gvn
                     
load of type i32 not eliminated because it is clobbered by store 
save_unicode
gvn
                     
load of type i16 not eliminated because it is clobbered by call 
save
gvn
                     
load of type i8 not eliminated because it is clobbered by store 
save
gvn
                     
load of type i32 not eliminated because it is clobbered by store 
save
2133
        /* Map 32-bit characters to '\Uxxxxxxxx' */
2134
        if (ch >= 0x10000) {
2135
            /* -1: subtract 1 preallocated byte */
2136
            p = _PyBytesWriter_Prepare(&writer, p, 10-1);
inline
                
_PyBytesWriter_Prepare will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2137
            if (p == NULL)
2138
                goto error;
2139
2140
            *p++ = '\\';
2141
            *p++ = 'U';
2142
            *p++ = Py_hexdigits[(ch >> 28) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2143
            *p++ = Py_hexdigits[(ch >> 24) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2144
            *p++ = Py_hexdigits[(ch >> 20) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2145
            *p++ = Py_hexdigits[(ch >> 16) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2146
            *p++ = Py_hexdigits[(ch >> 12) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2147
            *p++ = Py_hexdigits[(ch >> 8) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2148
            *p++ = Py_hexdigits[(ch >> 4) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2149
            *p++ = Py_hexdigits[ch & 15];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2150
        }
2151
        /* Map 16-bit characters, '\\' and '\n' to '\uxxxx' */
2152
        else if (ch >= 256 || ch == '\\' || ch == '\n') {
2153
            /* -1: subtract 1 preallocated byte */
2154
            p = _PyBytesWriter_Prepare(&writer, p, 6-1);
inline
                
_PyBytesWriter_Prepare will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2155
            if (p == NULL)
2156
                goto error;
2157
2158
            *p++ = '\\';
2159
            *p++ = 'u';
2160
            *p++ = Py_hexdigits[(ch >> 12) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2161
            *p++ = Py_hexdigits[(ch >> 8) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2162
            *p++ = Py_hexdigits[(ch >> 4) & 0xf];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2163
            *p++ = Py_hexdigits[ch & 15];
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
raw_unicode_escape
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
raw_unicode_escape
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
raw_unicode_escape
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_unicode
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save_unicode
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save_unicode
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type i8* not eliminated in favor of load because it is clobbered by store 
save
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
save
2164
        }
2165
        /* Copy everything else as-is */
2166
        else
2167
            *p++ = (char) ch;
2168
    }
2169
2170
    return _PyBytesWriter_Finish(&writer, p);
inline
           
_PyBytesWriter_Finish will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2171
2172
error:
2173
    _PyBytesWriter_Dealloc(&writer);
inline
    
_PyBytesWriter_Dealloc will not be inlined into raw_unicode_escape because its definition is unavailable 
raw_unicode_escape
2174
    return NULL;
2175
}
2176
2177
static int
2178
write_utf8(PicklerObject *self, const char *data, Py_ssize_t size)
2179
{
2180
    char header[9];
2181
    Py_ssize_t len;
2182
2183
    assert(size >= 0);
2184
    if (size <= 0xff && self->proto >= 4) {
2185
        header[0] = SHORT_BINUNICODE;
2186
        header[1] = (unsigned char)(size & 0xff);
2187
        len = 2;
2188
    }
2189
    else if ((size_t)size <= 0xffffffffUL) {
2190
        header[0] = BINUNICODE;
2191
        header[1] = (unsigned char)(size & 0xff);
2192
        header[2] = (unsigned char)((size >> 8) & 0xff);
2193
        header[3] = (unsigned char)((size >> 16) & 0xff);
2194
        header[4] = (unsigned char)((size >> 24) & 0xff);
2195
        len = 5;
2196
    }
2197
    else if (self->proto >= 4) {
2198
        header[0] = BINUNICODE8;
2199
        _write_size64(header + 1, size);
inline
        
_write_size64 can be inlined into write_utf8 with cost=-5 (threshold=375) 
write_utf8
inline
        
_write_size64 inlined into write_utf8 
write_utf8
2200
        len = 9;
2201
    }
2202
    else {
2203
        PyErr_SetString(PyExc_OverflowError,
inline
        
PyErr_SetString will not be inlined into write_utf8 because its definition is unavailable 
write_utf8
2204
                        "cannot serialize a string larger than 4GiB");
2205
        return -1;
2206
    }
2207
2208
    if (_Pickler_Write(self, header, len) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
write_utf8
inline
        
_Pickler_Write will not be inlined into write_utf8 
write_utf8
2209
        return -1;
2210
    if (_Pickler_Write(self, data, size) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
write_utf8
inline
        
_Pickler_Write will not be inlined into write_utf8 
write_utf8
2211
        return -1;
2212
2213
    return 0;
2214
}
2215
2216
static int
2217
write_unicode_binary(PicklerObject *self, PyObject *obj)
2218
{
2219
    PyObject *encoded = NULL;
2220
    Py_ssize_t size;
2221
    char *data;
2222
    int r;
2223
2224
    if (PyUnicode_READY(obj))
inline
        
_PyUnicode_Ready will not be inlined into write_unicode_binary because its definition is unavailable 
write_unicode_binary
gvn
        
load of type i32 not eliminated because it is clobbered by store 
save
gvn
        
load of type i32 not eliminated because it is clobbered by call 
save
gvn
        
load of type i32 not eliminated because it is clobbered by call 
save
gvn
        
load of type i32 not eliminated because it is clobbered by store 
save
2225
        return -1;
2226
2227
    data = PyUnicode_AsUTF8AndSize(obj, &size);
inline
           
PyUnicode_AsUTF8AndSize will not be inlined into write_unicode_binary because its definition is unavailable 
write_unicode_binary
2228
    if (data != NULL)
2229
        return write_utf8(self, data, size);
inline
               
write_utf8 too costly to inline (cost=285, threshold=250) 
write_unicode_binary
inline
               
write_utf8 will not be inlined into write_unicode_binary 
write_unicode_binary
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
write_unicode_binary
inline
               
write_utf8 too costly to inline (cost=285, threshold=250) 
save_unicode
inline
               
write_utf8 will not be inlined into save_unicode 
save_unicode
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
save_unicode
inline
               
write_utf8 too costly to inline (cost=285, threshold=250) 
save
inline
               
write_utf8 will not be inlined into save 
save
gvn
                                      
load of type i64 not eliminated because it is clobbered by call 
save
2230
2231
    /* Issue #8383: for strings with lone surrogates, fallback on the
2232
       "surrogatepass" error handler. */
2233
    PyErr_Clear();
inline
    
PyErr_Clear will not be inlined into write_unicode_binary because its definition is unavailable 
write_unicode_binary
2234
    encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
inline
              
PyUnicode_AsEncodedString will not be inlined into write_unicode_binary because its definition is unavailable 
write_unicode_binary
2235
    if (encoded == NULL)
2236
        return -1;
2237
2238
    r = write_utf8(self, PyBytes_AS_STRING(encoded),
inline
        
write_utf8 too costly to inline (cost=285, threshold=250) 
write_unicode_binary
inline
        
write_utf8 will not be inlined into write_unicode_binary 
write_unicode_binary
inline
        
write_utf8 too costly to inline (cost=285, threshold=250) 
save_unicode
inline
        
write_utf8 will not be inlined into save_unicode 
save_unicode
inline
        
write_utf8 too costly to inline (cost=285, threshold=250) 
save
inline
        
write_utf8 will not be inlined into save 
save
2239
                   PyBytes_GET_SIZE(encoded));
gvn
                   
load of type i64 not eliminated because it is clobbered by call 
write_unicode_binary
gvn
                   
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
                   
load of type i64 not eliminated because it is clobbered by call 
save
2240
    Py_DECREF(encoded);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
write_unicode_binary
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
write_unicode_binary
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_unicode
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2241
    return r;
2242
}
2243
2244
static int
2245
save_unicode(PicklerObject *self, PyObject *obj)
2246
{
2247
    if (self->bin) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2248
        if (write_unicode_binary(self, obj) < 0)
inline
            
write_unicode_binary can be inlined into save_unicode with cost=-14695 (threshold=250) 
save_unicode
inline
            
write_unicode_binary inlined into save_unicode 
save_unicode
2249
            return -1;
2250
    }
2251
    else {
2252
        PyObject *encoded;
2253
        Py_ssize_t size;
2254
        const char unicode_op = UNICODE;
2255
2256
        encoded = raw_unicode_escape(obj);
inline
                  
raw_unicode_escape can be inlined into save_unicode with cost=-13985 (threshold=250) 
save_unicode
inline
                  
raw_unicode_escape inlined into save_unicode 
save_unicode
2257
        if (encoded == NULL)
2258
            return -1;
2259
2260
        if (_Pickler_Write(self, &unicode_op, 1) < 0) {
inline
            
_Pickler_Write can be inlined into save_unicode with cost=230 (threshold=250) 
save_unicode
inline
            
_Pickler_Write inlined into save_unicode 
save_unicode
2261
            Py_DECREF(encoded);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2262
            return -1;
2263
        }
2264
2265
        size = PyBytes_GET_SIZE(encoded);
gvn
               
load of type i64 not eliminated because it is clobbered by store 
save_unicode
gvn
               
load of type i64 not eliminated because it is clobbered by store 
save
2266
        if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_unicode
inline
            
_Pickler_Write will not be inlined into save_unicode 
save_unicode
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
2267
            Py_DECREF(encoded);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_unicode
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2268
            return -1;
2269
        }
2270
        Py_DECREF(encoded);
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_unicode
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2271
2272
        if (_Pickler_Write(self, "\n", 1) < 0)
inline
            
_Pickler_Write can be inlined into save_unicode with cost=230 (threshold=250) 
save_unicode
inline
            
_Pickler_Write inlined into save_unicode 
save_unicode
2273
            return -1;
2274
    }
2275
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_unicode
inline
        
memo_put will not be inlined into save_unicode 
save_unicode
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
2276
        return -1;
2277
2278
    return 0;
2279
}
2280
2281
/* A helper for save_tuple.  Push the len elements in tuple t on the stack. */
2282
static int
2283
store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
2284
{
2285
    Py_ssize_t i;
2286
2287
    assert(PyTuple_Size(t) == len);
2288
2289
    for (i = 0; i < len; i++) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
    
loop not vectorized 
save
2290
        PyObject *element = PyTuple_GET_ITEM(t, i);
licm
                            
hosting getelementptr 
save_tuple
licm
                            
hosting bitcast 
save_tuple
licm
                            
hosting getelementptr 
save
licm
                            
hosting bitcast 
save
2291
2292
        if (element == NULL)
2293
            return -1;
2294
        if (save(self, element, 0) < 0)
inline
            
save too costly to inline (cost=655, threshold=625) 
store_tuple_elements
inline
            
save will not be inlined into store_tuple_elements 
store_tuple_elements
inline
            
save too costly to inline (cost=630, threshold=625) 
save_tuple
inline
            
save will not be inlined into save_tuple 
save_tuple
inline
            
save too costly to inline (cost=630, threshold=625) 
save
inline
            
save will not be inlined into save 
save
inline
            
save too costly to inline (cost=630, threshold=625) 
store_tuple_elements
2295
            return -1;
2296
    }
2297
2298
    return 0;
2299
}
2300
2301
/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2302
 * used across protocols to minimize the space needed to pickle them.
2303
 * Tuples are also the only builtin immutable type that can be recursive
2304
 * (a tuple can be reached from itself), and that requires some subtle
2305
 * magic so that it works in all cases.  IOW, this is a long routine.
2306
 */
2307
static int
2308
save_tuple(PicklerObject *self, PyObject *obj)
2309
{
2310
    Py_ssize_t len, i;
2311
2312
    const char mark_op = MARK;
2313
    const char tuple_op = TUPLE;
2314
    const char pop_op = POP;
2315
    const char pop_mark_op = POP_MARK;
2316
    const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2317
2318
    if ((len = PyTuple_Size(obj)) < 0)
inline
               
PyTuple_Size will not be inlined into save_tuple because its definition is unavailable 
save_tuple
2319
        return -1;
2320
2321
    if (len == 0) {
2322
        char pdata[2];
2323
2324
        if (self->proto) {
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save_tuple
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save
2325
            pdata[0] = EMPTY_TUPLE;
2326
            len = 1;
2327
        }
2328
        else {
2329
            pdata[0] = MARK;
2330
            pdata[1] = TUPLE;
2331
            len = 2;
2332
        }
2333
        if (_Pickler_Write(self, pdata, len) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_tuple
inline
            
_Pickler_Write will not be inlined into save_tuple 
save_tuple
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
            
_Pickler_Write will not be inlined into save 
save
2334
            return -1;
2335
        return 0;
2336
    }
2337
2338
    /* The tuple isn't in the memo now.  If it shows up there after
2339
     * saving the tuple elements, the tuple must be recursive, in
2340
     * which case we'll pop everything we put on the stack, and fetch
2341
     * its value from the memo.
2342
     */
2343
    if (len <= 3 && self->proto >= 2) {
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save_tuple
gvn
                          
load of type i32 not eliminated because it is clobbered by call 
save
2344
        /* Use TUPLE{1,2,3} opcodes. */
2345
        if (store_tuple_elements(self, obj, len) < 0)
inline
            
store_tuple_elements can be inlined into save_tuple with cost=-14950 (threshold=250) 
save_tuple
inline
            
store_tuple_elements inlined into save_tuple 
save_tuple
2346
            return -1;
2347
2348
        if (PyMemoTable_Get(self->memo, obj)) {
inline
            
PyMemoTable_Get can be inlined into save_tuple with cost=65 (threshold=250) 
save_tuple
inline
            
PyMemoTable_Get inlined into save_tuple 
save_tuple
gvn
                                  
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_tuple
gvn
                                  
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_tuple
gvn
                                  
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by call 
save
gvn
                                  
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by call 
save
2349
            /* pop the len elements */
2350
            for (i = 0; i < len; i++)
loop-vectorize
            
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
            
loop not vectorized 
save
2351
                if (_Pickler_Write(self, &pop_op, 1) < 0)
inline
                    
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
                    
_Pickler_Write inlined into save_tuple 
save_tuple
2352
                    return -1;
2353
            /* fetch from memo */
2354
            if (memo_get(self, obj) < 0)
inline
                
memo_get too costly to inline (cost=490, threshold=250) 
save_tuple
inline
                
memo_get will not be inlined into save_tuple 
save_tuple
inline
                
memo_get too costly to inline (cost=490, threshold=250) 
save
inline
                
memo_get will not be inlined into save 
save
2355
                return -1;
2356
2357
            return 0;
2358
        }
2359
        else { /* Not recursive. */
2360
            if (_Pickler_Write(self, len2opcode + len, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
                
_Pickler_Write inlined into save_tuple 
save_tuple
2361
                return -1;
2362
        }
2363
        goto memoize;
2364
    }
2365
2366
    /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2367
     * Generate MARK e1 e2 ... TUPLE
2368
     */
2369
    if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
        
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
        
_Pickler_Write inlined into save_tuple 
save_tuple
2370
        return -1;
2371
2372
    if (store_tuple_elements(self, obj, len) < 0)
inline
        
store_tuple_elements can be inlined into save_tuple with cost=50 (threshold=250) 
save_tuple
inline
        
store_tuple_elements inlined into save_tuple 
save_tuple
2373
        return -1;
2374
2375
    if (PyMemoTable_Get(self->memo, obj)) {
inline
        
PyMemoTable_Get can be inlined into save_tuple with cost=65 (threshold=250) 
save_tuple
inline
        
PyMemoTable_Get inlined into save_tuple 
save_tuple
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_tuple
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by store 
save_tuple
gvn
                              
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by store 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by call 
save
2376
        /* pop the stack stuff we pushed */
2377
        if (self->bin) {
gvn
                  
load of type i32 not eliminated because it is clobbered by store 
save_tuple
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save_tuple
gvn
                  
load of type i32 not eliminated because it is clobbered by store 
save
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save
2378
            if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
                
_Pickler_Write inlined into save_tuple 
save_tuple
2379
                return -1;
2380
        }
2381
        else {
2382
            /* Note that we pop one more than len, to remove
2383
             * the MARK too.
2384
             */
2385
            for (i = 0; i <= len; i++)
loop-vectorize
            
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
            
loop not vectorized 
save
2386
                if (_Pickler_Write(self, &pop_op, 1) < 0)
inline
                    
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
                    
_Pickler_Write inlined into save_tuple 
save_tuple
2387
                    return -1;
2388
        }
2389
        /* fetch from memo */
2390
        if (memo_get(self, obj) < 0)
inline
            
memo_get too costly to inline (cost=490, threshold=250) 
save_tuple
inline
            
memo_get will not be inlined into save_tuple 
save_tuple
inline
            
memo_get too costly to inline (cost=490, threshold=250) 
save
inline
            
memo_get will not be inlined into save 
save
2391
            return -1;
2392
2393
        return 0;
2394
    }
2395
    else { /* Not recursive. */
2396
        if (_Pickler_Write(self, &tuple_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_tuple with cost=230 (threshold=250) 
save_tuple
inline
            
_Pickler_Write inlined into save_tuple 
save_tuple
2397
            return -1;
2398
    }
2399
2400
  memoize:
2401
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_tuple
inline
        
memo_put will not be inlined into save_tuple 
save_tuple
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
2402
        return -1;
2403
2404
    return 0;
2405
}
2406
2407
/* iter is an iterator giving items, and we batch up chunks of
2408
 *     MARK item item ... item APPENDS
2409
 * opcode sequences.  Calling code should have arranged to first create an
2410
 * empty list, or list-like object, for the APPENDS to operate on.
2411
 * Returns 0 on success, <0 on error.
2412
 */
2413
static int
2414
batch_list(PicklerObject *self, PyObject *iter)
2415
{
2416
    PyObject *obj = NULL;
2417
    PyObject *firstitem = NULL;
2418
    int i, n;
2419
2420
    const char mark_op = MARK;
2421
    const char append_op = APPEND;
2422
    const char appends_op = APPENDS;
2423
2424
    assert(iter != NULL);
2425
2426
    /* XXX: I think this function could be made faster by avoiding the
2427
       iterator interface and fetching objects directly from list using
2428
       PyList_GET_ITEM.
2429
    */
2430
2431
    if (self->proto == 0) {
2432
        /* APPENDS isn't available; do one at a time. */
2433
        for (;;) {
2434
            obj = PyIter_Next(iter);
inline
                  
PyIter_Next will not be inlined into batch_list because its definition is unavailable 
batch_list
2435
            if (obj == NULL) {
loop-vectorize
                
loop not vectorized: loop control flow is not understood by vectorizer 
batch_list
loop-vectorize
                
loop not vectorized 
batch_list
2436
                if (PyErr_Occurred())
inline
                    
PyErr_Occurred will not be inlined into batch_list because its definition is unavailable 
batch_list
2437
                    return -1;
2438
                break;
2439
            }
2440
            i = save(self, obj, 0);
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_list
inline
                
save will not be inlined into batch_list 
batch_list
2441
            Py_DECREF(obj);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
2442
            if (i < 0)
2443
                return -1;
2444
            if (_Pickler_Write(self, &append_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into batch_list with cost=230 (threshold=250) 
batch_list
inline
                
_Pickler_Write inlined into batch_list 
batch_list
2445
                return -1;
2446
        }
2447
        return 0;
2448
    }
2449
2450
    /* proto > 0:  write in batches of BATCHSIZE. */
2451
    do {
2452
        /* Get first item */
2453
        firstitem = PyIter_Next(iter);
inline
                    
PyIter_Next will not be inlined into batch_list because its definition is unavailable 
batch_list
2454
        if (firstitem == NULL) {
2455
            if (PyErr_Occurred())
inline
                
PyErr_Occurred will not be inlined into batch_list because its definition is unavailable 
batch_list
2456
                goto error;
2457
2458
            /* nothing more to add */
2459
            break;
2460
        }
2461
2462
        /* Try to get a second item */
2463
        obj = PyIter_Next(iter);
inline
              
PyIter_Next will not be inlined into batch_list because its definition is unavailable 
batch_list
2464
        if (obj == NULL) {
2465
            if (PyErr_Occurred())
inline
                
PyErr_Occurred will not be inlined into batch_list because its definition is unavailable 
batch_list
2466
                goto error;
2467
2468
            /* Only one item to write */
2469
            if (save(self, firstitem, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_list
inline
                
save will not be inlined into batch_list 
batch_list
2470
                goto error;
2471
            if (_Pickler_Write(self, &append_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into batch_list with cost=230 (threshold=250) 
batch_list
inline
                
_Pickler_Write inlined into batch_list 
batch_list
2472
                goto error;
2473
            Py_CLEAR(firstitem);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
batch_list
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by store 
batch_list
2474
            break;
2475
        }
2476
2477
        /* More than one item to write */
2478
2479
        /* Pump out MARK, items, APPENDS. */
2480
        if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_list with cost=230 (threshold=250) 
batch_list
inline
            
_Pickler_Write inlined into batch_list 
batch_list
2481
            goto error;
2482
2483
        if (save(self, firstitem, 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_list
inline
            
save will not be inlined into batch_list 
batch_list
2484
            goto error;
2485
        Py_CLEAR(firstitem);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
2486
        n = 1;
2487
2488
        /* Fetch and save up to BATCHSIZE items */
2489
        while (obj) {
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
batch_list
loop-vectorize
        
loop not vectorized 
batch_list
2490
            if (save(self, obj, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_list
inline
                
save will not be inlined into batch_list 
batch_list
2491
                goto error;
2492
            Py_CLEAR(obj);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
2493
            n += 1;
2494
2495
            if (n == BATCHSIZE)
2496
                break;
2497
2498
            obj = PyIter_Next(iter);
inline
                  
PyIter_Next will not be inlined into batch_list because its definition is unavailable 
batch_list
2499
            if (obj == NULL) {
2500
                if (PyErr_Occurred())
inline
                    
PyErr_Occurred will not be inlined into batch_list because its definition is unavailable 
batch_list
2501
                    goto error;
2502
                break;
2503
            }
2504
        }
2505
2506
        if (_Pickler_Write(self, &appends_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_list with cost=230 (threshold=250) 
batch_list
inline
            
_Pickler_Write inlined into batch_list 
batch_list
2507
            goto error;
2508
2509
    } while (n == BATCHSIZE);
2510
    return 0;
2511
2512
  error:
2513
    Py_XDECREF(firstitem);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
2514
    Py_XDECREF(obj);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_list
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_list
2515
    return -1;
2516
}
2517
2518
/* This is a variant of batch_list() above, specialized for lists (with no
2519
 * support for list subclasses). Like batch_list(), we batch up chunks of
2520
 *     MARK item item ... item APPENDS
2521
 * opcode sequences.  Calling code should have arranged to first create an
2522
 * empty list, or list-like object, for the APPENDS to operate on.
2523
 * Returns 0 on success, -1 on error.
2524
 *
2525
 * This version is considerably faster than batch_list(), if less general.
2526
 *
2527
 * Note that this only works for protocols > 0.
2528
 */
2529
static int
2530
batch_list_exact(PicklerObject *self, PyObject *obj)
2531
{
2532
    PyObject *item = NULL;
2533
    Py_ssize_t this_batch, total;
2534
2535
    const char append_op = APPEND;
2536
    const char appends_op = APPENDS;
2537
    const char mark_op = MARK;
2538
2539
    assert(obj != NULL);
2540
    assert(self->proto > 0);
2541
    assert(PyList_CheckExact(obj));
2542
2543
    if (PyList_GET_SIZE(obj) == 1) {
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
2544
        item = PyList_GET_ITEM(obj, 0);
gvn
               
load of type %struct._object** not eliminated because it is clobbered by call 
save_list
gvn
               
load of type %struct._object** not eliminated because it is clobbered by call 
save
2545
        if (save(self, item, 0) < 0)
inline
            
save too costly to inline (cost=655, threshold=625) 
batch_list_exact
inline
            
save will not be inlined into batch_list_exact 
batch_list_exact
inline
            
save too costly to inline (cost=630, threshold=625) 
save_list
inline
            
save will not be inlined into save_list 
save_list
inline
            
save too costly to inline (cost=630, threshold=625) 
save
inline
            
save will not be inlined into save 
save
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_list_exact
2546
            return -1;
2547
        if (_Pickler_Write(self, &append_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_list_exact with cost=230 (threshold=250) 
batch_list_exact
inline
            
_Pickler_Write inlined into batch_list_exact 
batch_list_exact
2548
            return -1;
2549
        return 0;
2550
    }
2551
2552
    /* Write in batches of BATCHSIZE. */
2553
    total = 0;
2554
    do {
2555
        this_batch = 0;
2556
        if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_list_exact with cost=230 (threshold=250) 
batch_list_exact
inline
            
_Pickler_Write inlined into batch_list_exact 
batch_list_exact
2557
            return -1;
2558
        while (total < PyList_GET_SIZE(obj)) {
licm
                       
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
batch_list_exact
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by store 
batch_list_exact
licm
                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_list
licm
                       
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by call 
save
gvn
                       
load of type i64 not eliminated in favor of load because it is clobbered by store 
save
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
        
loop not vectorized 
save
2559
            item = PyList_GET_ITEM(obj, total);
licm
                   
hosting getelementptr 
batch_list_exact
licm
                   
hosting bitcast 
batch_list_exact
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by call 
batch_list_exact
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by store 
batch_list_exact
licm
                   
hosting getelementptr 
save_list
licm
                   
hosting bitcast 
save_list
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by call 
save_list
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by store 
save_list
licm
                   
hosting getelementptr 
save
licm
                   
hosting bitcast 
save
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by call 
save
gvn
                   
load of type %struct._object** not eliminated because it is clobbered by store 
save
2560
            if (save(self, item, 0) < 0)
inline
                
save too costly to inline (cost=655, threshold=625) 
batch_list_exact
inline
                
save will not be inlined into batch_list_exact 
batch_list_exact
inline
                
save too costly to inline (cost=630, threshold=625) 
save_list
inline
                
save will not be inlined into save_list 
save_list
inline
                
save too costly to inline (cost=630, threshold=625) 
save
inline
                
save will not be inlined into save 
save
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_list_exact
2561
                return -1;
2562
            total++;
2563
            if (++this_batch == BATCHSIZE)
2564
                break;
2565
        }
2566
        if (_Pickler_Write(self, &appends_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_list_exact with cost=230 (threshold=250) 
batch_list_exact
inline
            
_Pickler_Write inlined into batch_list_exact 
batch_list_exact
2567
            return -1;
2568
2569
    } while (total < PyList_GET_SIZE(obj));
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_list_exact
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
batch_list_exact
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save_list
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save_list
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                     
load of type i64 not eliminated because it is clobbered by store 
save
2570
2571
    return 0;
2572
}
2573
2574
static int
2575
save_list(PicklerObject *self, PyObject *obj)
2576
{
2577
    char header[3];
2578
    Py_ssize_t len;
2579
    int status = 0;
2580
2581
    if (self->fast && !fast_save_enter(self, obj))
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save_list
inline
                       
fast_save_enter will not be inlined into save_list 
save_list
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save
inline
                       
fast_save_enter will not be inlined into save 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2582
        goto error;
2583
2584
    /* Create an empty list. */
2585
    if (self->bin) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2586
        header[0] = EMPTY_LIST;
2587
        len = 1;
2588
    }
2589
    else {
2590
        header[0] = MARK;
2591
        header[1] = LIST;
2592
        len = 2;
2593
    }
2594
2595
    if (_Pickler_Write(self, header, len) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_list
inline
        
_Pickler_Write will not be inlined into save_list 
save_list
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
        
_Pickler_Write will not be inlined into save 
save
2596
        goto error;
2597
2598
    /* Get list length, and bow out early if empty. */
2599
    if ((len = PyList_Size(obj)) < 0)
inline
               
PyList_Size will not be inlined into save_list because its definition is unavailable 
save_list
2600
        goto error;
2601
2602
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_list
inline
        
memo_put will not be inlined into save_list 
save_list
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
2603
        goto error;
2604
2605
    if (len != 0) {
2606
        /* Materialize the list elements. */
2607
        if (PyList_CheckExact(obj) && self->proto > 0) {
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_list
gvn
                                            
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
save
gvn
                                            
load of type i32 not eliminated because it is clobbered by call 
save
2608
            if (Py_EnterRecursiveCall(" while pickling an object"))
inline
                
PyThreadState_Get will not be inlined into save_list because its definition is unavailable 
save_list
inline
                
_Py_CheckRecursiveCall will not be inlined into save_list because its definition is unavailable 
save_list
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2609
                goto error;
2610
            status = batch_list_exact(self, obj);
inline
                     
batch_list_exact can be inlined into save_list with cost=-13955 (threshold=250) 
save_list
inline
                     
batch_list_exact inlined into save_list 
save_list
2611
            Py_LeaveRecursiveCall();
inline
            
PyThreadState_Get will not be inlined into save_list because its definition is unavailable 
save_list
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save
2612
        } else {
2613
            PyObject *iter = PyObject_GetIter(obj);
inline
                             
PyObject_GetIter will not be inlined into save_list because its definition is unavailable 
save_list
2614
            if (iter == NULL)
2615
                goto error;
2616
2617
            if (Py_EnterRecursiveCall(" while pickling an object")) {
inline
                
PyThreadState_Get will not be inlined into save_list because its definition is unavailable 
save_list
inline
                
_Py_CheckRecursiveCall will not be inlined into save_list because its definition is unavailable 
save_list
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2618
                Py_DECREF(iter);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_list
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2619
                goto error;
2620
            }
2621
            status = batch_list(self, iter);
inline
                     
batch_list too costly to inline (cost=630, threshold=625) 
save_list
inline
                     
batch_list will not be inlined into save_list 
save_list
inline
                     
batch_list too costly to inline (cost=630, threshold=625) 
save
inline
                     
batch_list will not be inlined into save 
save
2622
            Py_LeaveRecursiveCall();
inline
            
PyThreadState_Get will not be inlined into save_list because its definition is unavailable 
save_list
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save_list
gvn
            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save
2623
            Py_DECREF(iter);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_list
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_list
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2624
        }
2625
    }
2626
    if (0) {
2627
  error:
2628
        status = -1;
2629
    }
2630
2631
    if (self->fast && !fast_save_leave(self, obj))
inline
                       
fast_save_leave can be inlined into save_list with cost=155 (threshold=250) 
save_list
inline
                       
fast_save_leave inlined into save_list 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_list
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2632
        status = -1;
2633
2634
    return status;
2635
}
2636
2637
/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2638
 *     MARK key value ... key value SETITEMS
2639
 * opcode sequences.  Calling code should have arranged to first create an
2640
 * empty dict, or dict-like object, for the SETITEMS to operate on.
2641
 * Returns 0 on success, <0 on error.
2642
 *
2643
 * This is very much like batch_list().  The difference between saving
2644
 * elements directly, and picking apart two-tuples, is so long-winded at
2645
 * the C level, though, that attempts to combine these routines were too
2646
 * ugly to bear.
2647
 */
2648
static int
2649
batch_dict(PicklerObject *self, PyObject *iter)
2650
{
2651
    PyObject *obj = NULL;
2652
    PyObject *firstitem = NULL;
2653
    int i, n;
2654
2655
    const char mark_op = MARK;
2656
    const char setitem_op = SETITEM;
2657
    const char setitems_op = SETITEMS;
2658
2659
    assert(iter != NULL);
2660
2661
    if (self->proto == 0) {
2662
        /* SETITEMS isn't available; do one at a time. */
2663
        for (;;) {
2664
            obj = PyIter_Next(iter);
inline
                  
PyIter_Next will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2665
            if (obj == NULL) {
loop-vectorize
                
loop not vectorized: loop control flow is not understood by vectorizer 
batch_dict
loop-vectorize
                
loop not vectorized 
batch_dict
2666
                if (PyErr_Occurred())
inline
                    
PyErr_Occurred will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2667
                    return -1;
2668
                break;
2669
            }
2670
            if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
inline
                                       
PyTuple_Size will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2671
                PyErr_SetString(PyExc_TypeError, "dict items "
inline
                
PyErr_SetString will not be inlined into batch_dict because its definition is unavailable 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2672
                                "iterator must return 2-tuples");
2673
                return -1;
2674
            }
2675
            i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                
save will not be inlined into batch_dict 
batch_dict
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2676
            if (i >= 0)
2677
                i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
inline
                    
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                    
save will not be inlined into batch_dict 
batch_dict
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2678
            Py_DECREF(obj);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
            
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
2679
            if (i < 0)
2680
                return -1;
2681
            if (_Pickler_Write(self, &setitem_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into batch_dict with cost=230 (threshold=250) 
batch_dict
inline
                
_Pickler_Write inlined into batch_dict 
batch_dict
2682
                return -1;
2683
        }
2684
        return 0;
2685
    }
2686
2687
    /* proto > 0:  write in batches of BATCHSIZE. */
2688
    do {
2689
        /* Get first item */
2690
        firstitem = PyIter_Next(iter);
inline
                    
PyIter_Next will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2691
        if (firstitem == NULL) {
2692
            if (PyErr_Occurred())
inline
                
PyErr_Occurred will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2693
                goto error;
2694
2695
            /* nothing more to add */
2696
            break;
2697
        }
2698
        if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
inline
                                         
PyTuple_Size will not be inlined into batch_dict because its definition is unavailable 
batch_dict
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_dict
2699
            PyErr_SetString(PyExc_TypeError, "dict items "
inline
            
PyErr_SetString will not be inlined into batch_dict because its definition is unavailable 
batch_dict
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2700
                                "iterator must return 2-tuples");
2701
            goto error;
2702
        }
2703
2704
        /* Try to get a second item */
2705
        obj = PyIter_Next(iter);
inline
              
PyIter_Next will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2706
        if (obj == NULL) {
2707
            if (PyErr_Occurred())
inline
                
PyErr_Occurred will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2708
                goto error;
2709
2710
            /* Only one item to write */
2711
            if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                
save will not be inlined into batch_dict 
batch_dict
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2712
                goto error;
2713
            if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                
save will not be inlined into batch_dict 
batch_dict
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2714
                goto error;
2715
            if (_Pickler_Write(self, &setitem_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into batch_dict with cost=230 (threshold=250) 
batch_dict
inline
                
_Pickler_Write inlined into batch_dict 
batch_dict
2716
                goto error;
2717
            Py_CLEAR(firstitem);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
batch_dict
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by store 
batch_dict
2718
            break;
2719
        }
2720
2721
        /* More than one item to write */
2722
2723
        /* Pump out MARK, items, SETITEMS. */
2724
        if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_dict with cost=230 (threshold=250) 
batch_dict
inline
            
_Pickler_Write inlined into batch_dict 
batch_dict
2725
            goto error;
2726
2727
        if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
            
save will not be inlined into batch_dict 
batch_dict
gvn
                       
load of type %struct._object* not eliminated because it is clobbered by store 
batch_dict
2728
            goto error;
2729
        if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
            
save will not be inlined into batch_dict 
batch_dict
gvn
                       
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2730
            goto error;
2731
        Py_CLEAR(firstitem);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
2732
        n = 1;
2733
2734
        /* Fetch and save up to BATCHSIZE items */
2735
        while (obj) {
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
batch_dict
loop-vectorize
        
loop not vectorized 
batch_dict
2736
            if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
inline
                                       
PyTuple_Size will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2737
                PyErr_SetString(PyExc_TypeError, "dict items "
inline
                
PyErr_SetString will not be inlined into batch_dict because its definition is unavailable 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2738
                    "iterator must return 2-tuples");
2739
                goto error;
2740
            }
2741
            if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                
save will not be inlined into batch_dict 
batch_dict
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2742
                save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict
inline
                
save will not be inlined into batch_dict 
batch_dict
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict
2743
                goto error;
2744
            Py_CLEAR(obj);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
2745
            n += 1;
2746
2747
            if (n == BATCHSIZE)
2748
                break;
2749
2750
            obj = PyIter_Next(iter);
inline
                  
PyIter_Next will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2751
            if (obj == NULL) {
2752
                if (PyErr_Occurred())
inline
                    
PyErr_Occurred will not be inlined into batch_dict because its definition is unavailable 
batch_dict
2753
                    goto error;
2754
                break;
2755
            }
2756
        }
2757
2758
        if (_Pickler_Write(self, &setitems_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_dict with cost=230 (threshold=250) 
batch_dict
inline
            
_Pickler_Write inlined into batch_dict 
batch_dict
2759
            goto error;
2760
2761
    } while (n == BATCHSIZE);
2762
    return 0;
2763
2764
  error:
2765
    Py_XDECREF(firstitem);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
batch_dict
2766
    Py_XDECREF(obj);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type i64 not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_dict
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
batch_dict
2767
    return -1;
2768
}
2769
2770
/* This is a variant of batch_dict() above that specializes for dicts, with no
2771
 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2772
 *     MARK key value ... key value SETITEMS
2773
 * opcode sequences.  Calling code should have arranged to first create an
2774
 * empty dict, or dict-like object, for the SETITEMS to operate on.
2775
 * Returns 0 on success, -1 on error.
2776
 *
2777
 * Note that this currently doesn't work for protocol 0.
2778
 */
2779
static int
2780
batch_dict_exact(PicklerObject *self, PyObject *obj)
2781
{
2782
    PyObject *key = NULL, *value = NULL;
2783
    int i;
2784
    Py_ssize_t dict_size, ppos = 0;
2785
2786
    const char mark_op = MARK;
2787
    const char setitem_op = SETITEM;
2788
    const char setitems_op = SETITEMS;
2789
2790
    assert(obj != NULL);
2791
    assert(self->proto > 0);
2792
2793
    dict_size = PyDict_Size(obj);
inline
                
PyDict_Size will not be inlined into batch_dict_exact because its definition is unavailable 
batch_dict_exact
2794
2795
    /* Special-case len(d) == 1 to save space. */
2796
    if (dict_size == 1) {
2797
        PyDict_Next(obj, &ppos, &key, &value);
inline
        
PyDict_Next will not be inlined into batch_dict_exact because its definition is unavailable 
batch_dict_exact
2798
        if (save(self, key, 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_dict_exact
inline
            
save will not be inlined into batch_dict_exact 
batch_dict_exact
inline
            
save too costly to inline (cost=630, threshold=625) 
save_dict
inline
            
save will not be inlined into save_dict 
save_dict
inline
            
save too costly to inline (cost=630, threshold=625) 
save
inline
            
save will not be inlined into save 
save
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
batch_dict_exact
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_dict
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save
2799
            return -1;
2800
        if (save(self, value, 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
batch_dict_exact
inline
            
save will not be inlined into batch_dict_exact 
batch_dict_exact
inline
            
save too costly to inline (cost=630, threshold=625) 
save_dict
inline
            
save will not be inlined into save_dict 
save_dict
inline
            
save too costly to inline (cost=630, threshold=625) 
save
inline
            
save will not be inlined into save 
save
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
batch_dict_exact
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_dict
gvn
                       
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save
2801
            return -1;
2802
        if (_Pickler_Write(self, &setitem_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_dict_exact with cost=230 (threshold=250) 
batch_dict_exact
inline
            
_Pickler_Write inlined into batch_dict_exact 
batch_dict_exact
2803
            return -1;
2804
        return 0;
2805
    }
2806
2807
    /* Write in batches of BATCHSIZE. */
2808
    do {
2809
        i = 0;
2810
        if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_dict_exact with cost=230 (threshold=250) 
batch_dict_exact
inline
            
_Pickler_Write inlined into batch_dict_exact 
batch_dict_exact
2811
            return -1;
2812
        while (PyDict_Next(obj, &ppos, &key, &value)) {
inline
               
PyDict_Next will not be inlined into batch_dict_exact because its definition is unavailable 
batch_dict_exact
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
        
loop not vectorized 
save
2813
            if (save(self, key, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict_exact
inline
                
save will not be inlined into batch_dict_exact 
batch_dict_exact
inline
                
save too costly to inline (cost=630, threshold=625) 
save_dict
inline
                
save will not be inlined into save_dict 
save_dict
inline
                
save too costly to inline (cost=630, threshold=625) 
save
inline
                
save will not be inlined into save 
save
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
batch_dict_exact
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_dict
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save
2814
                return -1;
2815
            if (save(self, value, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
batch_dict_exact
inline
                
save will not be inlined into batch_dict_exact 
batch_dict_exact
inline
                
save too costly to inline (cost=630, threshold=625) 
save_dict
inline
                
save will not be inlined into save_dict 
save_dict
inline
                
save too costly to inline (cost=630, threshold=625) 
save
inline
                
save will not be inlined into save 
save
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
batch_dict_exact
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
batch_dict_exact
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save_dict
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_dict
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                           
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save
2816
                return -1;
2817
            if (++i == BATCHSIZE)
2818
                break;
2819
        }
2820
        if (_Pickler_Write(self, &setitems_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into batch_dict_exact with cost=230 (threshold=250) 
batch_dict_exact
inline
            
_Pickler_Write inlined into batch_dict_exact 
batch_dict_exact
2821
            return -1;
2822
        if (PyDict_Size(obj) != dict_size) {
inline
            
PyDict_Size will not be inlined into batch_dict_exact because its definition is unavailable 
batch_dict_exact
2823
            PyErr_Format(
inline
            
PyErr_Format will not be inlined into batch_dict_exact because its definition is unavailable 
batch_dict_exact
2824
                PyExc_RuntimeError,
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
batch_dict_exact
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_dict
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save
2825
                "dictionary changed size during iteration");
2826
            return -1;
2827
        }
2828
2829
    } while (i == BATCHSIZE);
2830
    return 0;
2831
}
2832
2833
static int
2834
save_dict(PicklerObject *self, PyObject *obj)
2835
{
2836
    PyObject *items, *iter;
2837
    char header[3];
2838
    Py_ssize_t len;
2839
    int status = 0;
2840
2841
    if (self->fast && !fast_save_enter(self, obj))
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save_dict
inline
                       
fast_save_enter will not be inlined into save_dict 
save_dict
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save
inline
                       
fast_save_enter will not be inlined into save 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2842
        goto error;
2843
2844
    /* Create an empty dict. */
2845
    if (self->bin) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2846
        header[0] = EMPTY_DICT;
2847
        len = 1;
2848
    }
2849
    else {
2850
        header[0] = MARK;
2851
        header[1] = DICT;
2852
        len = 2;
2853
    }
2854
2855
    if (_Pickler_Write(self, header, len) < 0)
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_dict
inline
        
_Pickler_Write will not be inlined into save_dict 
save_dict
inline
        
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
        
_Pickler_Write will not be inlined into save 
save
2856
        goto error;
2857
2858
    /* Get dict size, and bow out early if empty. */
2859
    if ((len = PyDict_Size(obj)) < 0)
inline
               
PyDict_Size will not be inlined into save_dict because its definition is unavailable 
save_dict
2860
        goto error;
2861
2862
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_dict
inline
        
memo_put will not be inlined into save_dict 
save_dict
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
2863
        goto error;
2864
2865
    if (len != 0) {
2866
        /* Save the dict items. */
2867
        if (PyDict_CheckExact(obj) && self->proto > 0) {
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
                                            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
save
gvn
                                            
load of type i32 not eliminated because it is clobbered by call 
save
2868
            /* We can take certain shortcuts if we know this is a dict and
2869
               not a dict subclass. */
2870
            if (Py_EnterRecursiveCall(" while pickling an object"))
inline
                
PyThreadState_Get will not be inlined into save_dict because its definition is unavailable 
save_dict
inline
                
_Py_CheckRecursiveCall will not be inlined into save_dict because its definition is unavailable 
save_dict
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2871
                goto error;
2872
            status = batch_dict_exact(self, obj);
inline
                     
batch_dict_exact can be inlined into save_dict with cost=-13615 (threshold=250) 
save_dict
inline
                     
batch_dict_exact inlined into save_dict 
save_dict
2873
            Py_LeaveRecursiveCall();
inline
            
PyThreadState_Get will not be inlined into save_dict because its definition is unavailable 
save_dict
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save
2874
        } else {
2875
            _Py_IDENTIFIER(items);
2876
2877
            items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
inline
                    
_PyObject_CallMethodId will not be inlined into save_dict because its definition is unavailable 
save_dict
2878
            if (items == NULL)
2879
                goto error;
2880
            iter = PyObject_GetIter(items);
inline
                   
PyObject_GetIter will not be inlined into save_dict because its definition is unavailable 
save_dict
2881
            Py_DECREF(items);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2882
            if (iter == NULL)
2883
                goto error;
2884
            if (Py_EnterRecursiveCall(" while pickling an object")) {
inline
                
PyThreadState_Get will not be inlined into save_dict because its definition is unavailable 
save_dict
inline
                
_Py_CheckRecursiveCall will not be inlined into save_dict because its definition is unavailable 
save_dict
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
                
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2885
                Py_DECREF(iter);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2886
                goto error;
2887
            }
2888
            status = batch_dict(self, iter);
inline
                     
batch_dict too costly to inline (cost=630, threshold=625) 
save_dict
inline
                     
batch_dict will not be inlined into save_dict 
save_dict
inline
                     
batch_dict too costly to inline (cost=630, threshold=625) 
save
inline
                     
batch_dict will not be inlined into save 
save
2889
            Py_LeaveRecursiveCall();
inline
            
PyThreadState_Get will not be inlined into save_dict because its definition is unavailable 
save_dict
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
            
load of type i32 not eliminated because it is clobbered by call 
save
2890
            Py_DECREF(iter);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_dict
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2891
        }
2892
    }
2893
2894
    if (0) {
2895
  error:
2896
        status = -1;
2897
    }
2898
2899
    if (self->fast && !fast_save_leave(self, obj))
inline
                       
fast_save_leave can be inlined into save_dict with cost=-14845 (threshold=250) 
save_dict
inline
                       
fast_save_leave inlined into save_dict 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_dict
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
2900
        status = -1;
2901
2902
    return status;
2903
}
2904
2905
static int
2906
save_set(PicklerObject *self, PyObject *obj)
2907
{
2908
    PyObject *item;
2909
    int i;
2910
    Py_ssize_t set_size, ppos = 0;
2911
    Py_hash_t hash;
2912
2913
    const char empty_set_op = EMPTY_SET;
2914
    const char mark_op = MARK;
2915
    const char additems_op = ADDITEMS;
2916
2917
    if (self->proto < 4) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2918
        PyObject *items;
2919
        PyObject *reduce_value;
2920
        int status;
2921
2922
        items = PySequence_List(obj);
inline
                
PySequence_List will not be inlined into save_set because its definition is unavailable 
save_set
2923
        if (items == NULL) {
2924
            return -1;
2925
        }
2926
        reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
inline
                       
Py_BuildValue will not be inlined into save_set because its definition is unavailable 
save_set
2927
        Py_DECREF(items);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_set
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2928
        if (reduce_value == NULL) {
2929
            return -1;
2930
        }
2931
        /* save_reduce() will memoize the object automatically. */
2932
        status = save_reduce(self, reduce_value, obj);
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save_set
inline
                 
save_reduce will not be inlined into save_set 
save_set
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save
inline
                 
save_reduce will not be inlined into save 
save
2933
        Py_DECREF(reduce_value);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_set
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2934
        return status;
2935
    }
2936
2937
    if (_Pickler_Write(self, &empty_set_op, 1) < 0)
inline
        
_Pickler_Write can be inlined into save_set with cost=230 (threshold=250) 
save_set
inline
        
_Pickler_Write inlined into save_set 
save_set
2938
        return -1;
2939
2940
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_set
inline
        
memo_put will not be inlined into save_set 
save_set
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
2941
        return -1;
2942
2943
    set_size = PySet_GET_SIZE(obj);
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save_set
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save
2944
    if (set_size == 0)
2945
        return 0;  /* nothing to do */
2946
2947
    /* Write in batches of BATCHSIZE. */
2948
    do {
2949
        i = 0;
2950
        if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_set with cost=230 (threshold=250) 
save_set
inline
            
_Pickler_Write inlined into save_set 
save_set
2951
            return -1;
2952
        while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
inline
               
_PySet_NextEntry will not be inlined into save_set because its definition is unavailable 
save_set
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
        
loop not vectorized 
save
2953
            if (save(self, item, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
save_set
inline
                
save will not be inlined into save_set 
save_set
inline
                
save too costly to inline (cost=630, threshold=625) 
save
inline
                
save will not be inlined into save 
save
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
save_set
licm
                           
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
                           
load of type %struct._object* not eliminated because it is clobbered by call 
save
2954
                return -1;
2955
            if (++i == BATCHSIZE)
2956
                break;
2957
        }
2958
        if (_Pickler_Write(self, &additems_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_set with cost=230 (threshold=250) 
save_set
inline
            
_Pickler_Write inlined into save_set 
save_set
2959
            return -1;
2960
        if (PySet_GET_SIZE(obj) != set_size) {
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_set
gvn
            
load of type i64 not eliminated in favor of load because it is clobbered by store 
save_set
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
save
gvn
            
load of type i64 not eliminated in favor of load because it is clobbered by store 
save
2961
            PyErr_Format(
inline
            
PyErr_Format will not be inlined into save_set because its definition is unavailable 
save_set
2962
                PyExc_RuntimeError,
gvn
                
load of type %struct._object* not eliminated because it is clobbered by store 
save_set
gvn
                
load of type %struct._object* not eliminated because it is clobbered by store 
save
2963
                "set changed size during iteration");
2964
            return -1;
2965
        }
2966
    } while (i == BATCHSIZE);
2967
2968
    return 0;
2969
}
2970
2971
static int
2972
save_frozenset(PicklerObject *self, PyObject *obj)
2973
{
2974
    PyObject *iter;
2975
2976
    const char mark_op = MARK;
2977
    const char frozenset_op = FROZENSET;
2978
2979
    if (self->fast && !fast_save_enter(self, obj))
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save_frozenset
inline
                       
fast_save_enter will not be inlined into save_frozenset 
save_frozenset
inline
                       
fast_save_enter too costly to inline (cost=440, threshold=250) 
save
inline
                       
fast_save_enter will not be inlined into save 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2980
        return -1;
2981
2982
    if (self->proto < 4) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_frozenset
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by store 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save
2983
        PyObject *items;
2984
        PyObject *reduce_value;
2985
        int status;
2986
2987
        items = PySequence_List(obj);
inline
                
PySequence_List will not be inlined into save_frozenset because its definition is unavailable 
save_frozenset
2988
        if (items == NULL) {
2989
            return -1;
2990
        }
2991
        reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
inline
                       
Py_BuildValue will not be inlined into save_frozenset because its definition is unavailable 
save_frozenset
2992
                                     items);
2993
        Py_DECREF(items);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
2994
        if (reduce_value == NULL) {
2995
            return -1;
2996
        }
2997
        /* save_reduce() will memoize the object automatically. */
2998
        status = save_reduce(self, reduce_value, obj);
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save_frozenset
inline
                 
save_reduce will not be inlined into save_frozenset 
save_frozenset
inline
                 
save_reduce too costly to inline (cost=630, threshold=625) 
save
inline
                 
save_reduce will not be inlined into save 
save
2999
        Py_DECREF(reduce_value);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3000
        return status;
3001
    }
3002
3003
    if (_Pickler_Write(self, &mark_op, 1) < 0)
inline
        
_Pickler_Write can be inlined into save_frozenset with cost=230 (threshold=250) 
save_frozenset
inline
        
_Pickler_Write inlined into save_frozenset 
save_frozenset
3004
        return -1;
3005
3006
    iter = PyObject_GetIter(obj);
inline
           
PyObject_GetIter will not be inlined into save_frozenset because its definition is unavailable 
save_frozenset
3007
    if (iter == NULL) {
3008
        return -1;
3009
    }
3010
    for (;;) {
3011
        PyObject *item;
3012
3013
        item = PyIter_Next(iter);
inline
               
PyIter_Next will not be inlined into save_frozenset because its definition is unavailable 
save_frozenset
3014
        if (item == NULL) {
3015
            if (PyErr_Occurred()) {
inline
                
PyErr_Occurred will not be inlined into save_frozenset because its definition is unavailable 
save_frozenset
3016
                Py_DECREF(iter);
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3017
                return -1;
3018
            }
3019
            break;
3020
        }
3021
        if (save(self, item, 0) < 0) {
inline
            
save too costly to inline (cost=630, threshold=625) 
save_frozenset
inline
            
save will not be inlined into save_frozenset 
save_frozenset
inline
            
save too costly to inline (cost=630, threshold=625) 
save
inline
            
save will not be inlined into save 
save
loop-vectorize
            
loop not vectorized: loop control flow is not understood by vectorizer 
save
loop-vectorize
            
loop not vectorized 
save
3022
            Py_DECREF(item);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3023
            Py_DECREF(iter);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_frozenset
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_frozenset
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3024
            return -1;
3025
        }
3026
        Py_DECREF(item);
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3027
    }
3028
    Py_DECREF(iter);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_frozenset
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3029
3030
    /* If the object is already in the memo, this means it is
3031
       recursive. In this case, throw away everything we put on the
3032
       stack, and fetch the object back from the memo. */
3033
    if (PyMemoTable_Get(self->memo, obj)) {
inline
        
PyMemoTable_Get can be inlined into save_frozenset with cost=65 (threshold=250) 
save_frozenset
inline
        
PyMemoTable_Get inlined into save_frozenset 
save_frozenset
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_frozenset
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_frozenset
gvn
                              
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated in favor of load because it is clobbered by call 
save
3034
        const char pop_mark_op = POP_MARK;
3035
3036
        if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_frozenset with cost=230 (threshold=250) 
save_frozenset
inline
            
_Pickler_Write inlined into save_frozenset 
save_frozenset
3037
            return -1;
3038
        if (memo_get(self, obj) < 0)
inline
            
memo_get too costly to inline (cost=490, threshold=250) 
save_frozenset
inline
            
memo_get will not be inlined into save_frozenset 
save_frozenset
inline
            
memo_get too costly to inline (cost=490, threshold=250) 
save
inline
            
memo_get will not be inlined into save 
save
3039
            return -1;
3040
        return 0;
3041
    }
3042
3043
    if (_Pickler_Write(self, &frozenset_op, 1) < 0)
inline
        
_Pickler_Write can be inlined into save_frozenset with cost=230 (threshold=250) 
save_frozenset
inline
        
_Pickler_Write inlined into save_frozenset 
save_frozenset
3044
        return -1;
3045
    if (memo_put(self, obj) < 0)
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save_frozenset
inline
        
memo_put will not be inlined into save_frozenset 
save_frozenset
inline
        
memo_put too costly to inline (cost=630, threshold=625) 
save
inline
        
memo_put will not be inlined into save 
save
3046
        return -1;
3047
3048
    return 0;
3049
}
3050
3051
static int
3052
fix_imports(PyObject **module_name, PyObject **global_name)
3053
{
3054
    PyObject *key;
3055
    PyObject *item;
3056
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into fix_imports with cost=40 (threshold=375) 
fix_imports
inline
                      
_Pickle_GetGlobalState inlined into fix_imports 
fix_imports
3057
3058
    key = PyTuple_Pack(2, *module_name, *global_name);
inline
          
PyTuple_Pack will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
3059
    if (key == NULL)
3060
        return -1;
3061
    item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
inline
           
PyDict_GetItemWithError will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3062
    Py_DECREF(key);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fix_imports
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3063
    if (item) {
3064
        PyObject *fixed_module_name;
3065
        PyObject *fixed_global_name;
3066
3067
        if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fix_imports
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fix_imports
gvn
                                    
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
                                    
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
                                    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                                    
load of type i64 not eliminated because it is clobbered by call 
save_global
3068
            PyErr_Format(PyExc_RuntimeError,
inline
            
PyErr_Format will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3069
                         "_compat_pickle.REVERSE_NAME_MAPPING values "
3070
                         "should be 2-tuples, not %.200s",
3071
                         Py_TYPE(item)->tp_name);
3072
            return -1;
3073
        }
3074
        fixed_module_name = PyTuple_GET_ITEM(item, 0);
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3075
        fixed_global_name = PyTuple_GET_ITEM(item, 1);
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3076
        if (!PyUnicode_Check(fixed_module_name) ||
3077
            !PyUnicode_Check(fixed_global_name)) {
3078
            PyErr_Format(PyExc_RuntimeError,
inline
            
PyErr_Format will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3079
                         "_compat_pickle.REVERSE_NAME_MAPPING values "
3080
                         "should be pairs of str, not (%.200s, %.200s)",
3081
                         Py_TYPE(fixed_module_name)->tp_name,
3082
                         Py_TYPE(fixed_global_name)->tp_name);
3083
            return -1;
3084
        }
3085
3086
        Py_CLEAR(*module_name);
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3087
        Py_CLEAR(*global_name);
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by store 
fix_imports
gvn
        
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3088
        Py_INCREF(fixed_module_name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
3089
        Py_INCREF(fixed_global_name);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
3090
        *module_name = fixed_module_name;
3091
        *global_name = fixed_global_name;
3092
        return 0;
3093
    }
3094
    else if (PyErr_Occurred()) {
inline
             
PyErr_Occurred will not be inlined into fix_imports because its definition is unavailable 
fix_imports
3095
        return -1;
3096
    }
3097
3098
    item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
inline
           
PyDict_GetItemWithError will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                                                            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
fix_imports
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3099
    if (item) {
3100
        if (!PyUnicode_Check(item)) {
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
fix_imports
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3101
            PyErr_Format(PyExc_RuntimeError,
inline
            
PyErr_Format will not be inlined into fix_imports because its definition is unavailable 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3102
                         "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3103
                         "should be strings, not %.200s",
3104
                         Py_TYPE(item)->tp_name);
3105
            return -1;
3106
        }
3107
        Py_INCREF(item);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
3108
        Py_XSETREF(*module_name, item);
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by store 
fix_imports
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3109
    }
3110
    else if (PyErr_Occurred()) {
inline
             
PyErr_Occurred will not be inlined into fix_imports because its definition is unavailable 
fix_imports
3111
        return -1;
3112
    }
3113
3114
    return 0;
3115
}
3116
3117
static int
3118
save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3119
{
3120
    PyObject *global_name = NULL;
3121
    PyObject *module_name = NULL;
3122
    PyObject *module = NULL;
3123
    PyObject *parent = NULL;
3124
    PyObject *dotted_path = NULL;
3125
    PyObject *lastname = NULL;
3126
    PyObject *cls;
3127
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into save_global with cost=40 (threshold=375) 
save_global
inline
                      
_Pickle_GetGlobalState inlined into save_global 
save_global
3128
    int status = 0;
3129
    _Py_IDENTIFIER(__name__);
3130
    _Py_IDENTIFIER(__qualname__);
3131
3132
    const char global_op = GLOBAL;
3133
3134
    if (name) {
3135
        Py_INCREF(name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
3136
        global_name = name;
3137
    }
3138
    else {
3139
        global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
inline
                      
_PyObject_GetAttrId will not be inlined into save_global because its definition is unavailable 
save_global
3140
        if (global_name == NULL) {
3141
            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
inline
                 
PyErr_ExceptionMatches will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3142
                goto error;
3143
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into save_global because its definition is unavailable 
save_global
3144
        }
3145
        if (global_name == NULL) {
3146
            global_name = _PyObject_GetAttrId(obj, &PyId___name__);
inline
                          
_PyObject_GetAttrId will not be inlined into save_global because its definition is unavailable 
save_global
3147
            if (global_name == NULL)
3148
                goto error;
3149
        }
3150
    }
3151
3152
    dotted_path = get_dotted_path(module, global_name);
inline
                  
get_dotted_path too costly to inline (cost=325, threshold=250) 
save_global
inline
                  
get_dotted_path will not be inlined into save_global 
save_global
3153
    if (dotted_path == NULL)
3154
        goto error;
3155
    module_name = whichmodule(obj, dotted_path);
inline
                  
whichmodule can be inlined into save_global with cost=-13985 (threshold=250) 
save_global
inline
                  
whichmodule inlined into save_global 
save_global
3156
    if (module_name == NULL)
3157
        goto error;
3158
3159
    /* XXX: Change to use the import C API directly with level=0 to disallow
3160
       relative imports.
3161
3162
       XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3163
       builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3164
       custom import functions (IMHO, this would be a nice security
3165
       feature). The import C API would need to be extended to support the
3166
       extra parameters of __import__ to fix that. */
3167
    module = PyImport_Import(module_name);
inline
             
PyImport_Import will not be inlined into save_global because its definition is unavailable 
save_global
3168
    if (module == NULL) {
3169
        PyErr_Format(st->PicklingError,
inline
        
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3170
                     "Can't pickle %R: import of module %R failed",
3171
                     obj, module_name);
3172
        goto error;
3173
    }
3174
    lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
gvn
               
load of type %struct._object** not eliminated because it is clobbered by call 
save_global
gvn
               
load of type i64 not eliminated because it is clobbered by call 
save_global
3175
    Py_INCREF(lastname);
3176
    cls = get_deep_attribute(module, dotted_path, &parent);
inline
          
get_deep_attribute can be inlined into save_global with cost=165 (threshold=250) 
save_global
inline
          
get_deep_attribute inlined into save_global 
save_global
3177
    Py_CLEAR(dotted_path);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3178
    if (cls == NULL) {
3179
        PyErr_Format(st->PicklingError,
inline
        
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3180
                     "Can't pickle %R: attribute lookup %S on %S failed",
3181
                     obj, global_name, module_name);
3182
        goto error;
3183
    }
3184
    if (cls != obj) {
3185
        Py_DECREF(cls);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3186
        PyErr_Format(st->PicklingError,
inline
        
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3187
                     "Can't pickle %R: it's not the same object as %S.%S",
3188
                     obj, module_name, global_name);
3189
        goto error;
3190
    }
3191
    Py_DECREF(cls);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3192
3193
    if (self->proto >= 2) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_global
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_global
3194
        /* See whether this is in the extension registry, and if
3195
         * so generate an EXT opcode.
3196
         */
3197
        PyObject *extension_key;
3198
        PyObject *code_obj;      /* extension code as Python object */
3199
        long code;               /* extension code as C value */
3200
        char pdata[5];
3201
        Py_ssize_t n;
3202
3203
        extension_key = PyTuple_Pack(2, module_name, global_name);
inline
                        
PyTuple_Pack will not be inlined into save_global because its definition is unavailable 
save_global
3204
        if (extension_key == NULL) {
3205
            goto error;
3206
        }
3207
        code_obj = PyDict_GetItemWithError(st->extension_registry,
inline
                   
PyDict_GetItemWithError will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                               
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3208
                                           extension_key);
3209
        Py_DECREF(extension_key);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3210
        /* The object is not registered in the extension registry.
3211
           This is the most likely code path. */
3212
        if (code_obj == NULL) {
3213
            if (PyErr_Occurred()) {
inline
                
PyErr_Occurred will not be inlined into save_global because its definition is unavailable 
save_global
3214
                goto error;
3215
            }
3216
            goto gen_global;
3217
        }
3218
3219
        /* XXX: pickle.py doesn't check neither the type, nor the range
3220
           of the value returned by the extension_registry. It should for
3221
           consistency. */
3222
3223
        /* Verify code_obj has the right type and value. */
3224
        if (!PyLong_Check(code_obj)) {
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3225
            PyErr_Format(st->PicklingError,
inline
            
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3226
                         "Can't pickle %R: extension code %R isn't an integer",
3227
                         obj, code_obj);
3228
            goto error;
3229
        }
3230
        code = PyLong_AS_LONG(code_obj);
inline
               
PyLong_AsLong will not be inlined into save_global because its definition is unavailable 
save_global
3231
        if (code <= 0 || code > 0x7fffffffL) {
3232
            if (!PyErr_Occurred())
inline
                 
PyErr_Occurred will not be inlined into save_global because its definition is unavailable 
save_global
3233
                PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
inline
                
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3234
                             "code %ld is out of range", obj, code);
3235
            goto error;
3236
        }
3237
3238
        /* Generate an EXT opcode. */
3239
        if (code <= 0xff) {
3240
            pdata[0] = EXT1;
3241
            pdata[1] = (unsigned char)code;
3242
            n = 2;
3243
        }
3244
        else if (code <= 0xffff) {
3245
            pdata[0] = EXT2;
3246
            pdata[1] = (unsigned char)(code & 0xff);
3247
            pdata[2] = (unsigned char)((code >> 8) & 0xff);
3248
            n = 3;
3249
        }
3250
        else {
3251
            pdata[0] = EXT4;
3252
            pdata[1] = (unsigned char)(code & 0xff);
3253
            pdata[2] = (unsigned char)((code >> 8) & 0xff);
3254
            pdata[3] = (unsigned char)((code >> 16) & 0xff);
3255
            pdata[4] = (unsigned char)((code >> 24) & 0xff);
3256
            n = 5;
3257
        }
3258
3259
        if (_Pickler_Write(self, pdata, n) < 0)
inline
            
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_global
inline
            
_Pickler_Write will not be inlined into save_global 
save_global
3260
            goto error;
3261
    }
3262
    else {
3263
  gen_global:
3264
        if (parent == module) {
3265
            Py_INCREF(lastname);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_global
3266
            Py_DECREF(global_name);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3267
            global_name = lastname;
3268
        }
3269
        if (self->proto >= 4) {
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
3270
            const char stack_global_op = STACK_GLOBAL;
3271
3272
            if (save(self, module_name, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
save_global
inline
                
save will not be inlined into save_global 
save_global
3273
                goto error;
3274
            if (save(self, global_name, 0) < 0)
inline
                
save too costly to inline (cost=630, threshold=625) 
save_global
inline
                
save will not be inlined into save_global 
save_global
3275
                goto error;
3276
3277
            if (_Pickler_Write(self, &stack_global_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_global with cost=230 (threshold=250) 
save_global
inline
                
_Pickler_Write inlined into save_global 
save_global
3278
                goto error;
3279
        }
3280
        else if (parent != module) {
3281
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into save_global with cost=40 (threshold=375) 
save_global
inline
                              
_Pickle_GetGlobalState inlined into save_global 
save_global
3282
            PyObject *reduce_value = Py_BuildValue("(O(OO))",
inline
                                     
Py_BuildValue will not be inlined into save_global because its definition is unavailable 
save_global
3283
                                        st->getattr, parent, lastname);
gvn
                                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3284
            status = save_reduce(self, reduce_value, NULL);
inline
                     
save_reduce too costly to inline (cost=630, threshold=625) 
save_global
inline
                     
save_reduce will not be inlined into save_global 
save_global
3285
            Py_DECREF(reduce_value);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3286
            if (status < 0)
3287
                goto error;
3288
        }
3289
        else {
3290
            /* Generate a normal global opcode if we are using a pickle
3291
               protocol < 4, or if the object is not registered in the
3292
               extension registry. */
3293
            PyObject *encoded;
3294
            PyObject *(*unicode_encoder)(PyObject *);
3295
3296
            if (_Pickler_Write(self, &global_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_global with cost=230 (threshold=250) 
save_global
inline
                
_Pickler_Write inlined into save_global 
save_global
3297
                goto error;
3298
3299
            /* For protocol < 3 and if the user didn't request against doing
3300
               so, we convert module names to the old 2.x module names. */
3301
            if (self->proto < 3 && self->fix_imports) {
gvn
                      
load of type i32 not eliminated because it is clobbered by store 
save_global
gvn
                                         
load of type i32 not eliminated because it is clobbered by store 
save_global
3302
                if (fix_imports(&module_name, &global_name) < 0) {
inline
                    
fix_imports can be inlined into save_global with cost=-14170 (threshold=250) 
save_global
inline
                    
fix_imports inlined into save_global 
save_global
3303
                    goto error;
3304
                }
3305
            }
3306
3307
            /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3308
               both the module name and the global name using UTF-8. We do so
3309
               only when we are using the pickle protocol newer than version
3310
               3. This is to ensure compatibility with older Unpickler running
3311
               on Python 2.x. */
3312
            if (self->proto == 3) {
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
gvn
                      
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_global
3313
                unicode_encoder = PyUnicode_AsUTF8String;
3314
            }
3315
            else {
3316
                unicode_encoder = PyUnicode_AsASCIIString;
3317
            }
3318
            encoded = unicode_encoder(module_name);
3319
            if (encoded == NULL) {
3320
                if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
inline
                    
PyErr_ExceptionMatches will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                           
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3321
                    PyErr_Format(st->PicklingError,
inline
                    
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                     
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3322
                                 "can't pickle module identifier '%S' using "
3323
                                 "pickle protocol %i",
3324
                                 module_name, self->proto);
gvn
                                                    
load of type i32 not eliminated because it is clobbered by call 
save_global
3325
                goto error;
3326
            }
3327
            if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
inline
                
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_global
inline
                
_Pickler_Write will not be inlined into save_global 
save_global
3328
                               PyBytes_GET_SIZE(encoded)) < 0) {
gvn
                               
load of type i64 not eliminated because it is clobbered by call 
save_global
3329
                Py_DECREF(encoded);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3330
                goto error;
3331
            }
3332
            Py_DECREF(encoded);
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3333
            if(_Pickler_Write(self, "\n", 1) < 0)
inline
               
_Pickler_Write can be inlined into save_global with cost=230 (threshold=250) 
save_global
inline
               
_Pickler_Write inlined into save_global 
save_global
3334
                goto error;
3335
3336
            /* Save the name of the module. */
3337
            encoded = unicode_encoder(global_name);
3338
            if (encoded == NULL) {
3339
                if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
inline
                    
PyErr_ExceptionMatches will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                           
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3340
                    PyErr_Format(st->PicklingError,
inline
                    
PyErr_Format will not be inlined into save_global because its definition is unavailable 
save_global
gvn
                                     
load of type %struct._object* not eliminated because it is clobbered by call 
save_global
3341
                                 "can't pickle global identifier '%S' using "
3342
                                 "pickle protocol %i",
3343
                                 global_name, self->proto);
gvn
                                                    
load of type i32 not eliminated because it is clobbered by call 
save_global
3344
                goto error;
3345
            }
3346
            if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
inline
                
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_global
inline
                
_Pickler_Write will not be inlined into save_global 
save_global
3347
                               PyBytes_GET_SIZE(encoded)) < 0) {
gvn
                               
load of type i64 not eliminated because it is clobbered by call 
save_global
3348
                Py_DECREF(encoded);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3349
                goto error;
3350
            }
3351
            Py_DECREF(encoded);
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3352
            if (_Pickler_Write(self, "\n", 1) < 0)
inline
                
_Pickler_Write can be inlined into save_global with cost=230 (threshold=250) 
save_global
inline
                
_Pickler_Write inlined into save_global 
save_global
3353
                goto error;
3354
        }
3355
        /* Memoize the object. */
3356
        if (memo_put(self, obj) < 0)
inline
            
memo_put too costly to inline (cost=630, threshold=625) 
save_global
inline
            
memo_put will not be inlined into save_global 
save_global
3357
            goto error;
3358
    }
3359
3360
    if (0) {
3361
  error:
3362
        status = -1;
3363
    }
3364
    Py_XDECREF(module_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3365
    Py_XDECREF(global_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3366
    Py_XDECREF(module);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3367
    Py_XDECREF(parent);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3368
    Py_XDECREF(dotted_path);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3369
    Py_XDECREF(lastname);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_global
3370
3371
    return status;
3372
}
3373
3374
static int
3375
save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3376
{
3377
    PyObject *reduce_value;
3378
    int status;
3379
3380
    reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
inline
                   
Py_BuildValue will not be inlined into save_singleton_type because its definition is unavailable 
save_singleton_type
3381
    if (reduce_value == NULL) {
3382
        return -1;
3383
    }
3384
    status = save_reduce(self, reduce_value, obj);
inline
             
save_reduce too costly to inline (cost=630, threshold=625) 
save_singleton_type
inline
             
save_reduce will not be inlined into save_singleton_type 
save_singleton_type
inline
             
save_reduce too costly to inline (cost=630, threshold=625) 
save_type
inline
             
save_reduce will not be inlined into save_type 
save_type
inline
             
save_reduce too costly to inline (cost=630, threshold=625) 
save
inline
             
save_reduce will not be inlined into save 
save
3385
    Py_DECREF(reduce_value);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_singleton_type
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_singleton_type
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_type
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_type
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3386
    return status;
3387
}
3388
3389
static int
3390
save_type(PicklerObject *self, PyObject *obj)
3391
{
3392
    if (obj == (PyObject *)&_PyNone_Type) {
3393
        return save_singleton_type(self, obj, Py_None);
inline
               
save_singleton_type can be inlined into save_type with cost=100 (threshold=250) 
save_type
inline
               
save_singleton_type inlined into save_type 
save_type
inline
               
save_singleton_type can be inlined into save with cost=100 (threshold=250) 
save
inline
               
save_singleton_type inlined into save 
save
3394
    }
3395
    else if (obj == (PyObject *)&PyEllipsis_Type) {
3396
        return save_singleton_type(self, obj, Py_Ellipsis);
inline
               
save_singleton_type can be inlined into save_type with cost=100 (threshold=250) 
save_type
inline
               
save_singleton_type inlined into save_type 
save_type
inline
               
save_singleton_type can be inlined into save with cost=100 (threshold=250) 
save
inline
               
save_singleton_type inlined into save 
save
3397
    }
3398
    else if (obj == (PyObject *)&_PyNotImplemented_Type) {
3399
        return save_singleton_type(self, obj, Py_NotImplemented);
inline
               
save_singleton_type can be inlined into save_type with cost=100 (threshold=250) 
save_type
inline
               
save_singleton_type inlined into save_type 
save_type
inline
               
save_singleton_type can be inlined into save with cost=-14900 (threshold=250) 
save
inline
               
save_singleton_type inlined into save 
save
3400
    }
3401
    return save_global(self, obj, NULL);
inline
           
save_global too costly to inline (cost=630, threshold=625) 
save_type
inline
           
save_global will not be inlined into save_type 
save_type
inline
           
save_global too costly to inline (cost=630, threshold=625) 
save
inline
           
save_global will not be inlined into save 
save
3402
}
3403
3404
static int
3405
save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3406
{
3407
    PyObject *pid = NULL;
3408
    int status = 0;
3409
3410
    const char persid_op = PERSID;
3411
    const char binpersid_op = BINPERSID;
3412
3413
    Py_INCREF(obj);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
3414
    pid = _Pickle_FastCall(func, obj);
inline
          
_Pickle_FastCall can be inlined into save_pers with cost=70 (threshold=250) 
save_pers
inline
          
_Pickle_FastCall inlined into save_pers 
save_pers
3415
    if (pid == NULL)
3416
        return -1;
3417
3418
    if (pid != Py_None) {
3419
        if (self->bin) {
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save_pers
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save_pers
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save
gvn
                  
load of type i32 not eliminated because it is clobbered by call 
save
3420
            if (save(self, pid, 1) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_pers
inline
                
save will not be inlined into save_pers 
save_pers
inline
                
save too costly to inline (cost=630, threshold=625) 
save
inline
                
save will not be inlined into save 
save
3421
                _Pickler_Write(self, &binpersid_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_pers with cost=230 (threshold=250) 
save_pers
inline
                
_Pickler_Write inlined into save_pers 
save_pers
3422
                goto error;
3423
        }
3424
        else {
3425
            PyObject *pid_str;
3426
3427
            pid_str = PyObject_Str(pid);
inline
                      
PyObject_Str will not be inlined into save_pers because its definition is unavailable 
save_pers
3428
            if (pid_str == NULL)
3429
                goto error;
3430
3431
            /* XXX: Should it check whether the pid contains embedded
3432
               newlines? */
3433
            if (!PyUnicode_IS_ASCII(pid_str)) {
gvn
                 
load of type i32 not eliminated because it is clobbered by call 
save_pers
gvn
                 
load of type i32 not eliminated because it is clobbered by call 
save
3434
                PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
inline
                
PyErr_SetString will not be inlined into save_pers because its definition is unavailable 
save_pers
inline
                                
_Pickle_GetGlobalState can be inlined into save_pers with cost=40 (threshold=375) 
save_pers
inline
                                
_Pickle_GetGlobalState inlined into save_pers 
save_pers
gvn
                                                          
load of type %struct._object* not eliminated because it is clobbered by call 
save_pers
gvn
                                                          
load of type %struct._object* not eliminated because it is clobbered by call 
save
3435
                                "persistent IDs in protocol 0 must be "
3436
                                "ASCII strings");
3437
                Py_DECREF(pid_str);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3438
                goto error;
3439
            }
3440
3441
            if (_Pickler_Write(self, &persid_op, 1) < 0 ||
inline
                
_Pickler_Write can be inlined into save_pers with cost=230 (threshold=250) 
save_pers
inline
                
_Pickler_Write inlined into save_pers 
save_pers
3442
                _Pickler_Write(self, PyUnicode_DATA(pid_str),
inline
                
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save_pers
inline
                
_Pickler_Write will not be inlined into save_pers 
save_pers
inline
                
_Pickler_Write too costly to inline (cost=270, threshold=250) 
save
inline
                
_Pickler_Write will not be inlined into save 
save
gvn
                                     
load of type i32 not eliminated in favor of load because it is clobbered by store 
save_pers
gvn
                                     
load of type i8* not eliminated because it is clobbered by store 
save_pers
gvn
                                     
load of type i32 not eliminated in favor of load because it is clobbered by store 
save
gvn
                                     
load of type i8* not eliminated because it is clobbered by store 
save
3443
                               PyUnicode_GET_LENGTH(pid_str)) < 0 ||
gvn
                               
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
                               
load of type i64 not eliminated because it is clobbered by store 
save
3444
                _Pickler_Write(self, "\n", 1) < 0) {
inline
                
_Pickler_Write can be inlined into save_pers with cost=230 (threshold=250) 
save_pers
inline
                
_Pickler_Write inlined into save_pers 
save_pers
3445
                Py_DECREF(pid_str);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3446
                goto error;
3447
            }
3448
            Py_DECREF(pid_str);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save_pers
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save
3449
        }
3450
        status = 1;
3451
    }
3452
3453
    if (0) {
3454
  error:
3455
        status = -1;
3456
    }
3457
    Py_XDECREF(pid);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_pers
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3458
3459
    return status;
3460
}
3461
3462
static PyObject *
3463
get_class(PyObject *obj)
3464
{
3465
    PyObject *cls;
3466
    _Py_IDENTIFIER(__class__);
3467
3468
    cls = _PyObject_GetAttrId(obj, &PyId___class__);
inline
          
_PyObject_GetAttrId will not be inlined into get_class because its definition is unavailable 
get_class
3469
    if (cls == NULL) {
3470
        if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
inline
            
PyErr_ExceptionMatches will not be inlined into get_class because its definition is unavailable 
get_class
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
get_class
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3471
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into get_class because its definition is unavailable 
get_class
3472
            cls = (PyObject *) Py_TYPE(obj);
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
get_class
gvn
                               
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3473
            Py_INCREF(cls);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
get_class
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_reduce
3474
        }
3475
    }
3476
    return cls;
3477
}
3478
3479
/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3480
 * appropriate __reduce__ method for obj.
3481
 */
3482
static int
3483
save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3484
{
3485
    PyObject *callable;
3486
    PyObject *argtup;
3487
    PyObject *state = NULL;
3488
    PyObject *listitems = Py_None;
3489
    PyObject *dictitems = Py_None;
3490
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into save_reduce with cost=40 (threshold=375) 
save_reduce
inline
                      
_Pickle_GetGlobalState inlined into save_reduce 
save_reduce
3491
    Py_ssize_t size;
3492
    int use_newobj = 0, use_newobj_ex = 0;
3493
3494
    const char reduce_op = REDUCE;
3495
    const char build_op = BUILD;
3496
    const char newobj_op = NEWOBJ;
3497
    const char newobj_ex_op = NEWOBJ_EX;
3498
3499
    size = PyTuple_Size(args);
inline
           
PyTuple_Size will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3500
    if (size < 2 || size > 5) {
3501
        PyErr_SetString(st->PicklingError, "tuple returned by "
inline
        
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3502
                        "__reduce__ must contain 2 through 5 elements");
3503
        return -1;
3504
    }
3505
3506
    if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
inline
         
PyArg_UnpackTuple will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3507
                           &callable, &argtup, &state, &listitems, &dictitems))
3508
        return -1;
3509
3510
    if (!PyCallable_Check(callable)) {
inline
         
PyCallable_Check will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3511
        PyErr_SetString(st->PicklingError, "first item of the tuple "
inline
        
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3512
                        "returned by __reduce__ must be callable");
3513
        return -1;
3514
    }
3515
    if (!PyTuple_Check(argtup)) {
gvn
         
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3516
        PyErr_SetString(st->PicklingError, "second item of the tuple "
inline
        
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3517
                        "returned by __reduce__ must be a tuple");
3518
        return -1;
3519
    }
3520
3521
    if (state == Py_None)
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_reduce
3522
        state = NULL;
3523
3524
    if (listitems == Py_None)
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_reduce
3525
        listitems = NULL;
3526
    else if (!PyIter_Check(listitems)) {
3527
        PyErr_Format(st->PicklingError, "fourth element of the tuple "
inline
        
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3528
                     "returned by __reduce__ must be an iterator, not %s",
3529
                     Py_TYPE(listitems)->tp_name);
3530
        return -1;
3531
    }
3532
3533
    if (dictitems == Py_None)
gvn
        
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
save_reduce
3534
        dictitems = NULL;
3535
    else if (!PyIter_Check(dictitems)) {
3536
        PyErr_Format(st->PicklingError, "fifth element of the tuple "
inline
        
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3537
                     "returned by __reduce__ must be an iterator, not %s",
3538
                     Py_TYPE(dictitems)->tp_name);
3539
        return -1;
3540
    }
3541
3542
    if (self->proto >= 2) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
save_reduce
3543
        PyObject *name;
3544
        _Py_IDENTIFIER(__name__);
3545
3546
        name = _PyObject_GetAttrId(callable, &PyId___name__);
inline
               
_PyObject_GetAttrId will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                   
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
3547
        if (name == NULL) {
3548
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
inline
                 
PyErr_ExceptionMatches will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3549
                return -1;
3550
            }
3551
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3552
        }
3553
        else if (PyUnicode_Check(name)) {
gvn
                 
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3554
            _Py_IDENTIFIER(__newobj_ex__);
3555
            use_newobj_ex = PyUnicode_Compare(
inline
                            
PyUnicode_Compare will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3556
                    name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
inline
                          
_PyUnicode_FromId will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3557
            if (!use_newobj_ex) {
3558
                _Py_IDENTIFIER(__newobj__);
3559
                use_newobj = PyUnicode_Compare(
inline
                             
PyUnicode_Compare will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3560
                        name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
inline
                              
_PyUnicode_FromId will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3561
            }
3562
        }
3563
        Py_XDECREF(name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
save_reduce
3564
    }
3565
3566
    if (use_newobj_ex) {
3567
        PyObject *cls;
3568
        PyObject *args;
3569
        PyObject *kwargs;
3570
3571
        if (Py_SIZE(argtup) != 3) {
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
3572
            PyErr_Format(st->PicklingError,
inline
            
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3573
                         "length of the NEWOBJ_EX argument tuple must be "
3574
                         "exactly 3, not %zd", Py_SIZE(argtup));
3575
            return -1;
3576
        }
3577
3578
        cls = PyTuple_GET_ITEM(argtup, 0);
3579
        if (!PyType_Check(cls)) {
3580
            PyErr_Format(st->PicklingError,
inline
            
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3581
                         "first item from NEWOBJ_EX argument tuple must "
3582
                         "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3583
            return -1;
3584
        }
3585
        args = PyTuple_GET_ITEM(argtup, 1);
3586
        if (!PyTuple_Check(args)) {
3587
            PyErr_Format(st->PicklingError,
inline
            
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3588
                         "second item from NEWOBJ_EX argument tuple must "
3589
                         "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3590
            return -1;
3591
        }
3592
        kwargs = PyTuple_GET_ITEM(argtup, 2);
3593
        if (!PyDict_Check(kwargs)) {
3594
            PyErr_Format(st->PicklingError,
inline
            
PyErr_Format will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3595
                         "third item from NEWOBJ_EX argument tuple must "
3596
                         "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3597
            return -1;
3598
        }
3599
3600
        if (self->proto >= 4) {
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
save_reduce
3601
            if (save(self, cls, 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                
save will not be inlined into save_reduce 
save_reduce
3602
                save(self, args, 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                
save will not be inlined into save_reduce 
save_reduce
3603
                save(self, kwargs, 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                
save will not be inlined into save_reduce 
save_reduce
3604
                _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
inline
                
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
                
_Pickler_Write inlined into save_reduce 
save_reduce
3605
                return -1;
3606
            }
3607
        }
3608
        else {
3609
            PyObject *newargs;
3610
            PyObject *cls_new;
3611
            Py_ssize_t i;
3612
            _Py_IDENTIFIER(__new__);
3613
3614
            newargs = PyTuple_New(Py_SIZE(args) + 2);
inline
                      
PyTuple_New will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3615
            if (newargs == NULL)
3616
                return -1;
3617
3618
            cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
inline
                      
_PyObject_GetAttrId will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3619
            if (cls_new == NULL) {
3620
                Py_DECREF(newargs);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3621
                return -1;
3622
            }
3623
            PyTuple_SET_ITEM(newargs, 0, cls_new);
3624
            Py_INCREF(cls);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_reduce
3625
            PyTuple_SET_ITEM(newargs, 1, cls);
3626
            for (i = 0; i < Py_SIZE(args); i++) {
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
save_reduce
gvn
                            
load of type i64 not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                            
load of type i64 eliminated in favor of phi 
save_reduce
loop-vectorize
            
loop not vectorized: cannot identify array bounds 
save_reduce
loop-vectorize
            
loop not vectorized 
save_reduce
loop-unroll
            
unrolled loop by a factor of 2 with run-time trip count 
save_reduce
3627
                PyObject *item = PyTuple_GET_ITEM(args, i);
licm
                                 
hosting getelementptr 
save_reduce
licm
                                 
hosting bitcast 
save_reduce
3628
                Py_INCREF(item);
3629
                PyTuple_SET_ITEM(newargs, i + 2, item);
3630
            }
3631
3632
            callable = PyObject_Call(st->partial, newargs, kwargs);
inline
                       
PyObject_Call will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                         
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
gvn
                                         
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
3633
            Py_DECREF(newargs);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3634
            if (callable == NULL)
gvn
                
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                
load eliminated by PRE 
save_reduce
3635
                return -1;
3636
3637
            newargs = PyTuple_New(0);
inline
                      
PyTuple_New will not be inlined into save_reduce because its definition is unavailable 
save_reduce
3638
            if (newargs == NULL) {
3639
                Py_DECREF(callable);
gvn
                
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3640
                return -1;
3641
            }
3642
3643
            if (save(self, callable, 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                
save will not be inlined into save_reduce 
save_reduce
3644
                save(self, newargs, 0) < 0 ||
inline
                
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                
save will not be inlined into save_reduce 
save_reduce
3645
                _Pickler_Write(self, &reduce_op, 1) < 0) {
inline
                
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
                
_Pickler_Write inlined into save_reduce 
save_reduce
3646
                Py_DECREF(newargs);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3647
                Py_DECREF(callable);
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3648
                return -1;
3649
            }
3650
            Py_DECREF(newargs);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
save_reduce
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save_reduce
3651
            Py_DECREF(callable);
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
3652
        }
3653
    }
3654
    else if (use_newobj) {
3655
        PyObject *cls;
3656
        PyObject *newargtup;
3657
        PyObject *obj_class;
3658
        int p;
3659
3660
        /* Sanity checks. */
3661
        if (Py_SIZE(argtup) < 1) {
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
            
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
3662
            PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
inline
            
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3663
            return -1;
3664
        }
3665
3666
        cls = PyTuple_GET_ITEM(argtup, 0);
3667
        if (!PyType_Check(cls)) {
3668
            PyErr_SetString(st->PicklingError, "args[0] from "
inline
            
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3669
                            "__newobj__ args is not a type");
3670
            return -1;
3671
        }
3672
3673
        if (obj != NULL) {
3674
            obj_class = get_class(obj);
inline
                        
get_class can be inlined into save_reduce with cost=-14885 (threshold=250) 
save_reduce
inline
                        
get_class inlined into save_reduce 
save_reduce
3675
            p = obj_class != cls;    /* true iff a problem */
3676
            Py_DECREF(obj_class);
gvn
            
load eliminated by PRE 
save_reduce
3677
            if (p) {
3678
                PyErr_SetString(st->PicklingError, "args[0] from "
inline
                
PyErr_SetString will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
                                    
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3679
                                "__newobj__ args has the wrong class");
3680
                return -1;
3681
            }
3682
        }
3683
        /* XXX: These calls save() are prone to infinite recursion. Imagine
3684
           what happen if the value returned by the __reduce__() method of
3685
           some extension type contains another object of the same type. Ouch!
3686
3687
           Here is a quick example, that I ran into, to illustrate what I
3688
           mean:
3689
3690
             >>> import pickle, copyreg
3691
             >>> copyreg.dispatch_table.pop(complex)
3692
             >>> pickle.dumps(1+2j)
3693
             Traceback (most recent call last):
3694
               ...
3695
             RecursionError: maximum recursion depth exceeded
3696
3697
           Removing the complex class from copyreg.dispatch_table made the
3698
           __reduce_ex__() method emit another complex object:
3699
3700
             >>> (1+1j).__reduce_ex__(2)
3701
             (<function __newobj__ at 0xb7b71c3c>,
3702
               (<class 'complex'>, (1+1j)), None, None, None)
3703
3704
           Thus when save() was called on newargstup (the 2nd item) recursion
3705
           ensued. Of course, the bug was in the complex class which had a
3706
           broken __getnewargs__() that emitted another complex object. But,
3707
           the point, here, is it is quite easy to end up with a broken reduce
3708
           function. */
3709
3710
        /* Save the class and its __new__ arguments. */
3711
        if (save(self, cls, 0) < 0)
inline
            
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
            
save will not be inlined into save_reduce 
save_reduce
3712
            return -1;
3713
3714
        newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
inline
                    
PyTuple_GetSlice will not be inlined into save_reduce because its definition is unavailable 
save_reduce
gvn
                                     
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3715
        if (newargtup == NULL)
3716
            return -1;
3717
3718
        p = save(self, newargtup, 0);
inline
            
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
            
save will not be inlined into save_reduce 
save_reduce
3719
        Py_DECREF(newargtup);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save_reduce
3720
        if (p < 0)
3721
            return -1;
3722
3723
        /* Add NEWOBJ opcode. */
3724
        if (_Pickler_Write(self, &newobj_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
            
_Pickler_Write inlined into save_reduce 
save_reduce
3725
            return -1;
3726
    }
3727
    else { /* Not using NEWOBJ. */
3728
        if (save(self, callable, 0) < 0 ||
inline
            
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
            
save will not be inlined into save_reduce 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
3729
            save(self, argtup, 0) < 0 ||
inline
            
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
            
save will not be inlined into save_reduce 
save_reduce
gvn
                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
save_reduce
3730
            _Pickler_Write(self, &reduce_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
            
_Pickler_Write inlined into save_reduce 
save_reduce
3731
            return -1;
3732
    }
3733
3734
    /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3735
       the caller do not want to memoize the object. Not particularly useful,
3736
       but that is to mimic the behavior save_reduce() in pickle.py when
3737
       obj is None. */
3738
    if (obj != NULL) {
3739
        /* If the object is already in the memo, this means it is
3740
           recursive. In this case, throw away everything we put on the
3741
           stack, and fetch the object back from the memo. */
3742
        if (PyMemoTable_Get(self->memo, obj)) {
inline
            
PyMemoTable_Get can be inlined into save_reduce with cost=-14935 (threshold=250) 
save_reduce
inline
            
PyMemoTable_Get inlined into save_reduce 
save_reduce
gvn
                                  
load of type %struct.PyMemoTable* not eliminated because it is clobbered by store 
save_reduce
gvn
                                  
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_reduce
gvn
                                  
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save_reduce
3743
            const char pop_op = POP;
3744
3745
            if (_Pickler_Write(self, &pop_op, 1) < 0)
inline
                
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
                
_Pickler_Write inlined into save_reduce 
save_reduce
3746
                return -1;
3747
            if (memo_get(self, obj) < 0)
inline
                
memo_get too costly to inline (cost=490, threshold=250) 
save_reduce
inline
                
memo_get will not be inlined into save_reduce 
save_reduce
3748
                return -1;
3749
3750
            return 0;
3751
        }
3752
        else if (memo_put(self, obj) < 0)
inline
                 
memo_put too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                 
memo_put will not be inlined into save_reduce 
save_reduce
3753
            return -1;
3754
    }
3755
3756
    if (listitems && batch_list(self, listitems) < 0)
inline
                     
batch_list too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                     
batch_list will not be inlined into save_reduce 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3757
        return -1;
3758
3759
    if (dictitems && batch_dict(self, dictitems) < 0)
inline
                     
batch_dict too costly to inline (cost=630, threshold=625) 
save_reduce
inline
                     
batch_dict will not be inlined into save_reduce 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3760
        return -1;
3761
3762
    if (state) {
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by store 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
gvn
        
load of type %struct._object* not eliminated because it is clobbered by call 
save_reduce
3763
        if (save(self, state, 0) < 0 ||
inline
            
save too costly to inline (cost=630, threshold=625) 
save_reduce
inline
            
save will not be inlined into save_reduce 
save_reduce
3764
            _Pickler_Write(self, &build_op, 1) < 0)
inline
            
_Pickler_Write can be inlined into save_reduce with cost=230 (threshold=250) 
save_reduce
inline
            
_Pickler_Write inlined into save_reduce 
save_reduce
3765
            return -1;
3766
    }
3767
3768
    return 0;
3769
}
3770
3771
static int
3772
save(PicklerObject *self, PyObject *obj, int pers_save)
3773
{
3774
    PyTypeObject *type;
3775
    PyObject *reduce_func = NULL;
3776
    PyObject *reduce_value = NULL;
3777
    int status = 0;
3778
3779
    if (_Pickler_OpcodeBoundary(self) < 0)
inline
        
_Pickler_OpcodeBoundary can be inlined into save with cost=-14885 (threshold=250) 
save
inline
        
_Pickler_OpcodeBoundary inlined into save 
save
3780
        return -1;
3781
3782
    if (Py_EnterRecursiveCall(" while pickling an object"))
inline
        
PyThreadState_Get will not be inlined into save because its definition is unavailable 
save
inline
        
_Py_CheckRecursiveCall will not be inlined into save because its definition is unavailable 
save
gvn
        
load of type i32 not eliminated because it is clobbered by call 
save
3783
        return -1;
3784
3785
    /* The extra pers_save argument is necessary to avoid calling save_pers()
3786
       on its returned object. */
3787
    if (!pers_save && self->pers_func) {
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
3788
        /* save_pers() returns:
3789
            -1   to signal an error;
3790
             0   if it did nothing successfully;
3791
             1   if a persistent id was saved.
3792
         */
3793
        if ((status = save_pers(self, obj, self->pers_func)) != 0)
inline
                      
save_pers can be inlined into save with cost=-13475 (threshold=250) 
save
inline
                      
save_pers inlined into save 
save
3794
            goto done;
3795
    }
3796
3797
    type = Py_TYPE(obj);
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by store 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
           
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3798
3799
    /* The old cPickle had an optimization that used switch-case statement
3800
       dispatching on the first letter of the type name.  This has was removed
3801
       since benchmarks shown that this optimization was actually slowing
3802
       things down. */
3803
3804
    /* Atom types; these aren't memoized, so don't check the memo. */
3805
3806
    if (obj == Py_None) {
3807
        status = save_none(self, obj);
inline
                 
save_none can be inlined into save with cost=-14790 (threshold=250) 
save
inline
                 
save_none inlined into save 
save
3808
        goto done;
3809
    }
3810
    else if (obj == Py_False || obj == Py_True) {
3811
        status = save_bool(self, obj);
inline
                 
save_bool can be inlined into save with cost=-14440 (threshold=250) 
save
inline
                 
save_bool inlined into save 
save
3812
        goto done;
3813
    }
3814
    else if (type == &PyLong_Type) {
3815
        status = save_long(self, obj);
inline
                 
save_long can be inlined into save with cost=-13180 (threshold=250) 
save
inline
                 
save_long inlined into save 
save
3816
        goto done;
3817
    }
3818
    else if (type == &PyFloat_Type) {
3819
        status = save_float(self, obj);
inline
                 
save_float can be inlined into save with cost=-13990 (threshold=250) 
save
inline
                 
save_float inlined into save 
save
3820
        goto done;
3821
    }
3822
3823
    /* Check the memo to see if it has the object. If so, generate
3824
       a GET (or BINGET) opcode, instead of pickling the object
3825
       once again. */
3826
    if (PyMemoTable_Get(self->memo, obj)) {
inline
        
PyMemoTable_Get can be inlined into save with cost=65 (threshold=250) 
save
inline
        
PyMemoTable_Get inlined into save 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by store 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
gvn
                              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
save
3827
        if (memo_get(self, obj) < 0)
inline
            
memo_get too costly to inline (cost=490, threshold=250) 
save
inline
            
memo_get will not be inlined into save 
save
3828
            goto error;
3829
        goto done;
3830
    }
3831
3832
    if (type == &PyBytes_Type) {
3833
        status = save_bytes(self, obj);
inline
                 
save_bytes can be inlined into save with cost=-14215 (threshold=250) 
save
inline
                 
save_bytes inlined into save 
save
3834
        goto done;
3835
    }
3836
    else if (type == &PyUnicode_Type) {
3837
        status = save_unicode(self, obj);
inline
                 
save_unicode can be inlined into save with cost=-12675 (threshold=250) 
save
inline
                 
save_unicode inlined into save 
save
3838
        goto done;
3839
    }
3840
    else if (type == &PyDict_Type) {
3841
        status = save_dict(self, obj);
inline
                 
save_dict can be inlined into save with cost=-12380 (threshold=250) 
save
inline
                 
save_dict inlined into save 
save
3842
        goto done;
3843
    }
3844
    else if (type == &PySet_Type) {
3845
        status = save_set(self, obj);
inline
                 
save_set can be inlined into save with cost=-13615 (threshold=250) 
save
inline
                 
save_set inlined into save 
save
3846
        goto done;
3847
    }
3848
    else if (type == &PyFrozenSet_Type) {
3849
        status = save_frozenset(self, obj);
inline
                 
save_frozenset can be inlined into save with cost=-13200 (threshold=250) 
save
inline
                 
save_frozenset inlined into save 
save
3850
        goto done;
3851
    }
3852
    else if (type == &PyList_Type) {
3853
        status = save_list(self, obj);
inline
                 
save_list can be inlined into save with cost=-12810 (threshold=250) 
save
inline
                 
save_list inlined into save 
save
3854
        goto done;
3855
    }
3856
    else if (type == &PyTuple_Type) {
3857
        status = save_tuple(self, obj);
inline
                 
save_tuple can be inlined into save with cost=-12440 (threshold=250) 
save
inline
                 
save_tuple inlined into save 
save
3858
        goto done;
3859
    }
3860
    else if (type == &PyType_Type) {
3861
        status = save_type(self, obj);
inline
                 
save_type can be inlined into save with cost=-14830 (threshold=250) 
save
inline
                 
save_type inlined into save 
save
3862
        goto done;
3863
    }
3864
    else if (type == &PyFunction_Type) {
3865
        status = save_global(self, obj, NULL);
inline
                 
save_global too costly to inline (cost=630, threshold=625) 
save
inline
                 
save_global will not be inlined into save 
save
3866
        goto done;
3867
    }
3868
3869
    /* XXX: This part needs some unit tests. */
3870
3871
    /* Get a reduction callable, and call it.  This may come from
3872
     * self.dispatch_table, copyreg.dispatch_table, the object's
3873
     * __reduce_ex__ method, or the object's __reduce__ method.
3874
     */
3875
    if (self->dispatch_table == NULL) {
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by store 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
save
3876
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into save with cost=40 (threshold=375) 
save
inline
                          
_Pickle_GetGlobalState inlined into save 
save
3877
        reduce_func = PyDict_GetItemWithError(st->dispatch_table,
inline
                      
PyDict_GetItemWithError will not be inlined into save because its definition is unavailable 
save
gvn
                                                  
load of type %struct._object* not eliminated because it is clobbered by call 
save
3878
                                              (PyObject *)type);
3879
        if (reduce_func == NULL) {
3880
            if (PyErr_Occurred()) {
inline
                
PyErr_Occurred will not be inlined into save because its definition is unavailable 
save
3881
                goto error;
3882
            }
3883
        } else {
3884
            /* PyDict_GetItemWithError() returns a borrowed reference.
3885
               Increase the reference count to be consistent with
3886
               PyObject_GetItem and _PyObject_GetAttrId used below. */
3887
            Py_INCREF(reduce_func);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
save
3888
        }
3889
    } else {
3890
        reduce_func = PyObject_GetItem(self->dispatch_table,
inline
                      
PyObject_GetItem will not be inlined into save because its definition is unavailable 
save
3891
                                       (PyObject *)type);
3892
        if (reduce_func == NULL) {
3893
            if (PyErr_ExceptionMatches(PyExc_KeyError))
inline
                
PyErr_ExceptionMatches will not be inlined into save because its definition is unavailable 
save
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
save
3894
                PyErr_Clear();
inline
                
PyErr_Clear will not be inlined into save because its definition is unavailable 
save
3895
            else
3896
                goto error;
3897
        }
3898
    }
3899
    if (reduce_func != NULL) {
3900
        Py_INCREF(obj);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
save
gvn
        
load of type i64 not eliminated because it is clobbered by store 
save
3901
        reduce_value = _Pickle_FastCall(reduce_func, obj);
inline
                       
_Pickle_FastCall can be inlined into save with cost=70 (threshold=250) 
save
inline
                       
_Pickle_FastCall inlined into save 
save
3902
    }
3903
    else if (PyType_IsSubtype(type, &PyType_Type)) {
inline
             
PyType_IsSubtype will not be inlined into save because its definition is unavailable 
save
3904
        status = save_global(self, obj, NULL);
inline
                 
save_global too costly to inline (cost=630, threshold=625) 
save
inline
                 
save_global will not be inlined into save 
save
3905
        goto done;
3906
    }
3907
    else {
3908
        _Py_IDENTIFIER(__reduce__);
3909
        _Py_IDENTIFIER(__reduce_ex__);
3910
3911
3912
        /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3913
           automatically defined as __reduce__. While this is convenient, this
3914
           make it impossible to know which method was actually called. Of
3915
           course, this is not a big deal. But still, it would be nice to let
3916
           the user know which method was called when something go
3917
           wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3918
           don't actually have to check for a __reduce__ method. */
3919
3920
        /* Check for a __reduce_ex__ method. */
3921
        reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
inline
                      
_PyObject_GetAttrId will not be inlined into save because its definition is unavailable 
save
3922
        if (reduce_func != NULL) {
3923
            PyObject *proto;
3924
            proto = PyLong_FromLong(self->proto);
inline
                    
PyLong_FromLong will not be inlined into save because its definition is unavailable 
save
gvn
                                          
load of type i32 not eliminated because it is clobbered by call 
save
3925
            if (proto != NULL) {
3926
                reduce_value = _Pickle_FastCall(reduce_func, proto);
inline
                               
_Pickle_FastCall can be inlined into save with cost=70 (threshold=250) 
save
inline
                               
_Pickle_FastCall inlined into save 
save
3927
            }
3928
        }
3929
        else {
3930
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into save with cost=40 (threshold=375) 
save
inline
                              
_Pickle_GetGlobalState inlined into save 
save
3931
3932
            if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
inline
                
PyErr_ExceptionMatches will not be inlined into save because its definition is unavailable 
save
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
save
3933
                PyErr_Clear();
inline
                
PyErr_Clear will not be inlined into save because its definition is unavailable 
save
3934
            }
3935
            else {
3936
                goto error;
3937
            }
3938
            /* Check for a __reduce__ method. */
3939
            reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
inline
                          
_PyObject_GetAttrId will not be inlined into save because its definition is unavailable 
save
3940
            if (reduce_func != NULL) {
3941
                reduce_value = _PyObject_CallNoArg(reduce_func);
inline
                               
_PyObject_FastCallDict will not be inlined into save because its definition is unavailable 
save
3942
            }
3943
            else {
3944
                PyErr_Format(st->PicklingError,
inline
                
PyErr_Format will not be inlined into save because its definition is unavailable 
save
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
save
3945
                             "can't pickle '%.200s' object: %R",
3946
                             type->tp_name, obj);
gvn
                                   
load of type i8* not eliminated because it is clobbered by call 
save
3947
                goto error;
3948
            }
3949
        }
3950
    }
3951
3952
    if (reduce_value == NULL)
3953
        goto error;
3954
3955
    if (PyUnicode_Check(reduce_value)) {
3956
        status = save_global(self, obj, reduce_value);
inline
                 
save_global too costly to inline (cost=635, threshold=625) 
save
inline
                 
save_global will not be inlined into save 
save
3957
        goto done;
3958
    }
3959
3960
    if (!PyTuple_Check(reduce_value)) {
3961
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into save with cost=40 (threshold=375) 
save
inline
                          
_Pickle_GetGlobalState inlined into save 
save
3962
        PyErr_SetString(st->PicklingError,
inline
        
PyErr_SetString will not be inlined into save because its definition is unavailable 
save
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
save
3963
                        "__reduce__ must return a string or tuple");
3964
        goto error;
3965
    }
3966
3967
    status = save_reduce(self, reduce_value, obj);
inline
             
save_reduce too costly to inline (cost=630, threshold=625) 
save
inline
             
save_reduce will not be inlined into save 
save
3968
3969
    if (0) {
3970
  error:
3971
        status = -1;
3972
    }
3973
  done:
3974
3975
    Py_LeaveRecursiveCall();
inline
    
PyThreadState_Get will not be inlined into save because its definition is unavailable 
save
gvn
    
load of type i32 not eliminated because it is clobbered by call 
save
gvn
    
load of type i32 not eliminated in favor of load because it is clobbered by call 
save
3976
    Py_XDECREF(reduce_func);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3977
    Py_XDECREF(reduce_value);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type i64 not eliminated because it is clobbered by store 
save
gvn
    
load of type i64 not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
save
3978
3979
    return status;
3980
}
3981
3982
static int
3983
dump(PicklerObject *self, PyObject *obj)
3984
{
3985
    const char stop_op = STOP;
3986
3987
    if (self->proto >= 2) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
              
load of type i32 not eliminated because it is clobbered by call 
_pickle_dump
gvn
              
load of type i32 eliminated in favor of trunc 
_pickle_dumps_impl
gvn
              
load of type i32 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
3988
        char header[2];
3989
3990
        header[0] = PROTO;
3991
        assert(self->proto >= 0 && self->proto < 256);
3992
        header[1] = (unsigned char)self->proto;
gvn
                                         
load of type i32 eliminated in favor of load 
dump
3993
        if (_Pickler_Write(self, header, 2) < 0)
inline
            
Not inlining. Cost of inlining _Pickler_Write increases the cost of inlining dump in other contexts 
dump
inline
            
_Pickler_Write will not be inlined into dump 
dump
inline
            
_Pickler_Write can be inlined into _pickle_dump_impl with cost=230 (threshold=250) 
_pickle_dump_impl
inline
            
_Pickler_Write inlined into _pickle_dump_impl 
_pickle_dump_impl
inline
            
_Pickler_Write can be inlined into _pickle_dumps_impl with cost=230 (threshold=250) 
_pickle_dumps_impl
inline
            
_Pickler_Write inlined into _pickle_dumps_impl 
_pickle_dumps_impl
inline
            
_Pickler_Write can be inlined into _pickle_Pickler_dump with cost=230 (threshold=250) 
_pickle_Pickler_dump
inline
            
_Pickler_Write inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
3994
            return -1;
3995
        if (self->proto >= 4)
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by call 
dump
gvn
                  
load of type i32 not eliminated in favor of store because it is clobbered by store 
_pickle_dump_impl
gvn
                  
load of type i32 not eliminated in favor of store because it is clobbered by store 
_pickle_dump
gvn
                  
load of type i32 not eliminated because it is clobbered by store 
_pickle_dumps_impl
gvn
                  
load of type i32 not eliminated because it is clobbered by store 
_pickle_dumps
gvn
                  
load of type i32 not eliminated in favor of load because it is clobbered by store 
_pickle_Pickler_dump
3996
            self->framing = 1;
3997
    }
3998
3999
    if (save(self, obj, 0) < 0 ||
inline
        
save too costly to inline (cost=630, threshold=625) 
dump
inline
        
save will not be inlined into dump 
dump
inline
        
save too costly to inline (cost=630, threshold=625) 
_pickle_dump_impl
inline
        
save will not be inlined into _pickle_dump_impl 
_pickle_dump_impl
inline
        
save too costly to inline (cost=630, threshold=625) 
_pickle_dump
inline
        
save will not be inlined into _pickle_dump 
_pickle_dump
inline
        
save too costly to inline (cost=630, threshold=625) 
_pickle_dumps_impl
inline
        
save will not be inlined into _pickle_dumps_impl 
_pickle_dumps_impl
inline
        
save too costly to inline (cost=630, threshold=625) 
_pickle_dumps
inline
        
save will not be inlined into _pickle_dumps 
_pickle_dumps
inline
        
save too costly to inline (cost=630, threshold=625) 
_pickle_Pickler_dump
inline
        
save will not be inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4000
        _Pickler_Write(self, &stop_op, 1) < 0)
inline
        
Not inlining. Cost of inlining _Pickler_Write increases the cost of inlining dump in other contexts 
dump
inline
        
_Pickler_Write will not be inlined into dump 
dump
inline
        
_Pickler_Write can be inlined into _pickle_dump_impl with cost=230 (threshold=250) 
_pickle_dump_impl
inline
        
_Pickler_Write inlined into _pickle_dump_impl 
_pickle_dump_impl
inline
        
_Pickler_Write can be inlined into _pickle_dumps_impl with cost=230 (threshold=250) 
_pickle_dumps_impl
inline
        
_Pickler_Write inlined into _pickle_dumps_impl 
_pickle_dumps_impl
inline
        
_Pickler_Write can be inlined into _pickle_Pickler_dump with cost=230 (threshold=250) 
_pickle_Pickler_dump
inline
        
_Pickler_Write inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4001
        return -1;
4002
4003
    return 0;
4004
}
4005
4006
/*[clinic input]
4007
4008
_pickle.Pickler.clear_memo
4009
4010
Clears the pickler's "memo".
4011
4012
The memo is the data structure that remembers which objects the
4013
pickler has already seen, so that shared or recursive objects are
4014
pickled by reference and not by value.  This method is useful when
4015
re-using picklers.
4016
[clinic start generated code]*/
4017
4018
static PyObject *
4019
_pickle_Pickler_clear_memo_impl(PicklerObject *self)
4020
/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
4021
{
4022
    if (self->memo)
4023
        PyMemoTable_Clear(self->memo);
inline
        
PyMemoTable_Clear can be inlined into _pickle_Pickler_clear_memo_impl with cost=95 (threshold=250) 
_pickle_Pickler_clear_memo_impl
inline
        
PyMemoTable_Clear inlined into _pickle_Pickler_clear_memo_impl 
_pickle_Pickler_clear_memo_impl
4024
4025
    Py_RETURN_NONE;
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_clear_memo_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_clear_memo
4026
}
4027
4028
/*[clinic input]
4029
4030
_pickle.Pickler.dump
4031
4032
  obj: object
4033
  /
4034
4035
Write a pickled representation of the given object to the open file.
4036
[clinic start generated code]*/
4037
4038
static PyObject *
4039
_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
4040
/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
4041
{
4042
    /* Check whether the Pickler was initialized correctly (issue3664).
4043
       Developers often forget to call __init__() in their subclasses, which
4044
       would trigger a segfault without this check. */
4045
    if (self->write == NULL) {
4046
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into _pickle_Pickler_dump with cost=-14960 (threshold=375) 
_pickle_Pickler_dump
inline
                          
_Pickle_GetGlobalState inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4047
        PyErr_Format(st->PicklingError,
inline
        
PyErr_Format will not be inlined into _pickle_Pickler_dump because its definition is unavailable 
_pickle_Pickler_dump
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
4048
                     "Pickler.__init__() was not called by %s.__init__()",
4049
                     Py_TYPE(self)->tp_name);
gvn
                     
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
                                    
load of type i8* not eliminated because it is clobbered by call 
_pickle_Pickler_dump
4050
        return NULL;
4051
    }
4052
4053
    if (_Pickler_ClearBuffer(self) < 0)
inline
        
_Pickler_ClearBuffer can be inlined into _pickle_Pickler_dump with cost=-14900 (threshold=250) 
_pickle_Pickler_dump
inline
        
_Pickler_ClearBuffer inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4054
        return NULL;
4055
4056
    if (dump(self, obj) < 0)
inline
        
dump can be inlined into _pickle_Pickler_dump with cost=-14820 (threshold=250) 
_pickle_Pickler_dump
inline
        
dump inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4057
        return NULL;
4058
4059
    if (_Pickler_FlushToFile(self) < 0)
inline
        
_Pickler_FlushToFile can be inlined into _pickle_Pickler_dump with cost=-14820 (threshold=250) 
_pickle_Pickler_dump
inline
        
_Pickler_FlushToFile inlined into _pickle_Pickler_dump 
_pickle_Pickler_dump
4060
        return NULL;
4061
4062
    Py_RETURN_NONE;
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_Pickler_dump
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_Pickler_dump
4063
}
4064
4065
/*[clinic input]
4066
4067
_pickle.Pickler.__sizeof__ -> Py_ssize_t
4068
4069
Returns size in memory, in bytes.
4070
[clinic start generated code]*/
4071
4072
static Py_ssize_t
4073
_pickle_Pickler___sizeof___impl(PicklerObject *self)
4074
/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4075
{
4076
    Py_ssize_t res, s;
4077
4078
    res = _PyObject_SIZE(Py_TYPE(self));
4079
    if (self->memo != NULL) {
4080
        res += sizeof(PyMemoTable);
4081
        res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4082
    }
4083
    if (self->output_buffer != NULL) {
4084
        s = _PySys_GetSizeOf(self->output_buffer);
inline
            
_PySys_GetSizeOf will not be inlined into _pickle_Pickler___sizeof___impl because its definition is unavailable 
_pickle_Pickler___sizeof___impl
4085
        if (s == -1)
4086
            return -1;
4087
        res += s;
4088
    }
4089
    return res;
4090
}
4091
4092
static struct PyMethodDef Pickler_methods[] = {
4093
    _PICKLE_PICKLER_DUMP_METHODDEF
4094
    _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
4095
    _PICKLE_PICKLER___SIZEOF___METHODDEF
4096
    {NULL, NULL}                /* sentinel */
4097
};
4098
4099
static void
4100
Pickler_dealloc(PicklerObject *self)
4101
{
4102
    PyObject_GC_UnTrack(self);
inline
    
PyObject_GC_UnTrack will not be inlined into Pickler_dealloc because its definition is unavailable 
Pickler_dealloc
4103
4104
    Py_XDECREF(self->output_buffer);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
4105
    Py_XDECREF(self->write);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
4106
    Py_XDECREF(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
4107
    Py_XDECREF(self->dispatch_table);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
4108
    Py_XDECREF(self->fast_memo);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_dealloc
4109
4110
    PyMemoTable_Del(self->memo);
inline
    
PyMemoTable_Del can be inlined into Pickler_dealloc with cost=180 (threshold=250) 
Pickler_dealloc
inline
    
PyMemoTable_Del inlined into Pickler_dealloc 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_dealloc
4111
4112
    Py_TYPE(self)->tp_free((PyObject *)self);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Pickler_dealloc
4113
}
4114
4115
static int
4116
Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4117
{
4118
    Py_VISIT(self->write);
4119
    Py_VISIT(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
4120
    Py_VISIT(self->dispatch_table);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
4121
    Py_VISIT(self->fast_memo);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_traverse
4122
    return 0;
4123
}
4124
4125
static int
4126
Pickler_clear(PicklerObject *self)
4127
{
4128
    Py_CLEAR(self->output_buffer);
4129
    Py_CLEAR(self->write);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
4130
    Py_CLEAR(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
4131
    Py_CLEAR(self->dispatch_table);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
4132
    Py_CLEAR(self->fast_memo);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_clear
4133
4134
    if (self->memo != NULL) {
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_clear
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_clear
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_clear
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_clear
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_clear
4135
        PyMemoTable *memo = self->memo;
4136
        self->memo = NULL;
4137
        PyMemoTable_Del(memo);
inline
        
PyMemoTable_Del can be inlined into Pickler_clear with cost=170 (threshold=250) 
Pickler_clear
inline
        
PyMemoTable_Del inlined into Pickler_clear 
Pickler_clear
4138
    }
4139
    return 0;
4140
}
4141
4142
4143
/*[clinic input]
4144
4145
_pickle.Pickler.__init__
4146
4147
  file: object
4148
  protocol: object = NULL
4149
  fix_imports: bool = True
4150
4151
This takes a binary file for writing a pickle data stream.
4152
4153
The optional *protocol* argument tells the pickler to use the given
4154
protocol; supported protocols are 0, 1, 2, 3 and 4.  The default
4155
protocol is 3; a backward-incompatible protocol designed for Python 3.
4156
4157
Specifying a negative protocol version selects the highest protocol
4158
version supported.  The higher the protocol used, the more recent the
4159
version of Python needed to read the pickle produced.
4160
4161
The *file* argument must have a write() method that accepts a single
4162
bytes argument. It can thus be a file object opened for binary
4163
writing, an io.BytesIO instance, or any other custom object that meets
4164
this interface.
4165
4166
If *fix_imports* is True and protocol is less than 3, pickle will try
4167
to map the new Python 3 names to the old module names used in Python
4168
2, so that the pickle data stream is readable with Python 2.
4169
[clinic start generated code]*/
4170
4171
static int
4172
_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4173
                              PyObject *protocol, int fix_imports)
4174
/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/
4175
{
4176
    _Py_IDENTIFIER(persistent_id);
4177
    _Py_IDENTIFIER(dispatch_table);
4178
4179
    /* In case of multiple __init__() calls, clear previous content. */
4180
    if (self->write != NULL)
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
4181
        (void)Pickler_clear(self);
inline
              
Pickler_clear too costly to inline (cost=515, threshold=250) 
_pickle_Pickler___init___impl
inline
              
Pickler_clear will not be inlined into _pickle_Pickler___init___impl 
_pickle_Pickler___init___impl
inline
              
Pickler_clear too costly to inline (cost=515, threshold=250) 
_pickle_Pickler___init__
inline
              
Pickler_clear will not be inlined into _pickle_Pickler___init__ 
_pickle_Pickler___init__
4182
4183
    if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
inline
        
_Pickler_SetProtocol can be inlined into _pickle_Pickler___init___impl with cost=-14830 (threshold=250) 
_pickle_Pickler___init___impl
inline
        
_Pickler_SetProtocol inlined into _pickle_Pickler___init___impl 
_pickle_Pickler___init___impl
4184
        return -1;
4185
4186
    if (_Pickler_SetOutputStream(self, file) < 0)
inline
        
_Pickler_SetOutputStream can be inlined into _pickle_Pickler___init___impl with cost=-14890 (threshold=250) 
_pickle_Pickler___init___impl
inline
        
_Pickler_SetOutputStream inlined into _pickle_Pickler___init___impl 
_pickle_Pickler___init___impl
4187
        return -1;
4188
4189
    /* memo and output_buffer may have already been created in _Pickler_New */
4190
    if (self->memo == NULL) {
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
              
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
4191
        self->memo = PyMemoTable_New();
inline
                     
PyMemoTable_New can be inlined into _pickle_Pickler___init___impl with cost=180 (threshold=250) 
_pickle_Pickler___init___impl
inline
                     
PyMemoTable_New inlined into _pickle_Pickler___init___impl 
_pickle_Pickler___init___impl
4192
        if (self->memo == NULL)
4193
            return -1;
4194
    }
4195
    self->output_len = 0;
4196
    if (self->output_buffer == NULL) {
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init___impl
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Pickler___init__
4197
        self->max_output_len = WRITE_BUF_SIZE;
4198
        self->output_buffer = PyBytes_FromStringAndSize(NULL,
inline
                              
PyBytes_FromStringAndSize will not be inlined into _pickle_Pickler___init___impl because its definition is unavailable 
_pickle_Pickler___init___impl
4199
                                                        self->max_output_len);
4200
        if (self->output_buffer == NULL)
4201
            return -1;
4202
    }
4203
4204
    self->fast = 0;
4205
    self->fast_nesting = 0;
4206
    self->fast_memo = NULL;
4207
    self->pers_func = NULL;
4208
    if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
inline
        
_PyObject_HasAttrId will not be inlined into _pickle_Pickler___init___impl because its definition is unavailable 
_pickle_Pickler___init___impl
4209
        self->pers_func = _PyObject_GetAttrId((PyObject *)self,
inline
                          
_PyObject_GetAttrId will not be inlined into _pickle_Pickler___init___impl because its definition is unavailable 
_pickle_Pickler___init___impl
4210
                                              &PyId_persistent_id);
4211
        if (self->pers_func == NULL)
4212
            return -1;
4213
    }
4214
    self->dispatch_table = NULL;
4215
    if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
inline
        
_PyObject_HasAttrId will not be inlined into _pickle_Pickler___init___impl because its definition is unavailable 
_pickle_Pickler___init___impl
4216
        self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
inline
                               
_PyObject_GetAttrId will not be inlined into _pickle_Pickler___init___impl because its definition is unavailable 
_pickle_Pickler___init___impl
4217
                                                   &PyId_dispatch_table);
4218
        if (self->dispatch_table == NULL)
4219
            return -1;
4220
    }
4221
4222
    return 0;
4223
}
4224
4225
4226
/* Define a proxy object for the Pickler's internal memo object. This is to
4227
 * avoid breaking code like:
4228
 *  pickler.memo.clear()
4229
 * and
4230
 *  pickler.memo = saved_memo
4231
 * Is this a good idea? Not really, but we don't want to break code that uses
4232
 * it. Note that we don't implement the entire mapping API here. This is
4233
 * intentional, as these should be treated as black-box implementation details.
4234
 */
4235
4236
/*[clinic input]
4237
_pickle.PicklerMemoProxy.clear
4238
4239
Remove all items from memo.
4240
[clinic start generated code]*/
4241
4242
static PyObject *
4243
_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
4244
/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
4245
{
4246
    if (self->pickler->memo)
4247
        PyMemoTable_Clear(self->pickler->memo);
inline
        
PyMemoTable_Clear can be inlined into _pickle_PicklerMemoProxy_clear_impl with cost=-14905 (threshold=250) 
_pickle_PicklerMemoProxy_clear_impl
inline
        
PyMemoTable_Clear inlined into _pickle_PicklerMemoProxy_clear_impl 
_pickle_PicklerMemoProxy_clear_impl
4248
    Py_RETURN_NONE;
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_clear_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_clear
4249
}
4250
4251
/*[clinic input]
4252
_pickle.PicklerMemoProxy.copy
4253
4254
Copy the memo to a new object.
4255
[clinic start generated code]*/
4256
4257
static PyObject *
4258
_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
4259
/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
4260
{
4261
    Py_ssize_t i;
4262
    PyMemoTable *memo;
4263
    PyObject *new_memo = PyDict_New();
inline
                         
PyDict_New will not be inlined into _pickle_PicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_PicklerMemoProxy_copy_impl
4264
    if (new_memo == NULL)
4265
        return NULL;
4266
4267
    memo = self->pickler->memo;
gvn
                 
load of type %struct.PicklerObject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4268
    for (i = 0; i < memo->mt_allocated; ++i) {
licm
                          
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_PicklerMemoProxy_copy_impl
gvn
                          
load of type i64 not eliminated in favor of load because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                          
load of type i64 not eliminated in favor of load because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                          
load of type i64 not eliminated in favor of load because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                          
load eliminated by PRE 
_pickle_PicklerMemoProxy_copy_impl
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
_pickle_PicklerMemoProxy_copy_impl
loop-vectorize
    
loop not vectorized 
_pickle_PicklerMemoProxy_copy_impl
4269
        PyMemoEntry entry = memo->mt_table[i];
licm
                                  
hosting getelementptr 
_pickle_PicklerMemoProxy_copy_impl
licm
                                  
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_PicklerMemoProxy_copy_impl
gvn
                                  
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                                  
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                                  
load of type %struct.PyMemoEntry* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4270
        if (entry.me_key != NULL) {
4271
            int status;
4272
            PyObject *key, *value;
4273
4274
            key = PyLong_FromVoidPtr(entry.me_key);
inline
                  
PyLong_FromVoidPtr will not be inlined into _pickle_PicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_PicklerMemoProxy_copy_impl
4275
            value = Py_BuildValue("nO", entry.me_value, entry.me_key);
inline
                    
Py_BuildValue will not be inlined into _pickle_PicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_PicklerMemoProxy_copy_impl
4276
4277
            if (key == NULL || value == NULL) {
4278
                Py_XDECREF(key);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4279
                Py_XDECREF(value);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy_copy_impl
gvn
                
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4280
                goto error;
4281
            }
4282
            status = PyDict_SetItem(new_memo, key, value);
inline
                     
PyDict_SetItem will not be inlined into _pickle_PicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_PicklerMemoProxy_copy_impl
4283
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4284
            Py_DECREF(value);
gvn
            
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy_copy_impl
gvn
            
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4285
            if (status < 0)
4286
                goto error;
4287
        }
4288
    }
4289
    return new_memo;
4290
4291
  error:
4292
    Py_XDECREF(new_memo);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy_copy_impl
4293
    return NULL;
4294
}
4295
4296
/*[clinic input]
4297
_pickle.PicklerMemoProxy.__reduce__
4298
4299
Implement pickle support.
4300
[clinic start generated code]*/
4301
4302
static PyObject *
4303
_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
4304
/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
4305
{
4306
    PyObject *reduce_value, *dict_args;
4307
    PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
inline
                         
_pickle_PicklerMemoProxy_copy_impl too costly to inline (cost=475, threshold=250) 
_pickle_PicklerMemoProxy___reduce___impl
inline
                         
_pickle_PicklerMemoProxy_copy_impl will not be inlined into _pickle_PicklerMemoProxy___reduce___impl 
_pickle_PicklerMemoProxy___reduce___impl
inline
                         
_pickle_PicklerMemoProxy_copy_impl too costly to inline (cost=475, threshold=250) 
_pickle_PicklerMemoProxy___reduce__
inline
                         
_pickle_PicklerMemoProxy_copy_impl will not be inlined into _pickle_PicklerMemoProxy___reduce__ 
_pickle_PicklerMemoProxy___reduce__
4308
    if (contents == NULL)
4309
        return NULL;
4310
4311
    reduce_value = PyTuple_New(2);
inline
                   
PyTuple_New will not be inlined into _pickle_PicklerMemoProxy___reduce___impl because its definition is unavailable 
_pickle_PicklerMemoProxy___reduce___impl
4312
    if (reduce_value == NULL) {
4313
        Py_DECREF(contents);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
4314
        return NULL;
4315
    }
4316
    dict_args = PyTuple_New(1);
inline
                
PyTuple_New will not be inlined into _pickle_PicklerMemoProxy___reduce___impl because its definition is unavailable 
_pickle_PicklerMemoProxy___reduce___impl
4317
    if (dict_args == NULL) {
4318
        Py_DECREF(contents);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
4319
        Py_DECREF(reduce_value);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
gvn
        
load of type i64 not eliminated because it is clobbered by store 
_pickle_PicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
4320
        return NULL;
4321
    }
4322
    PyTuple_SET_ITEM(dict_args, 0, contents);
4323
    Py_INCREF((PyObject *)&PyDict_Type);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce___impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_PicklerMemoProxy___reduce__
4324
    PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4325
    PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4326
    return reduce_value;
4327
}
4328
4329
static PyMethodDef picklerproxy_methods[] = {
4330
    _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4331
    _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4332
    _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
4333
    {NULL, NULL} /* sentinel */
4334
};
4335
4336
static void
4337
PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4338
{
4339
    PyObject_GC_UnTrack(self);
inline
    
PyObject_GC_UnTrack will not be inlined into PicklerMemoProxy_dealloc because its definition is unavailable 
PicklerMemoProxy_dealloc
4340
    Py_XDECREF(self->pickler);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
PicklerMemoProxy_dealloc
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PicklerMemoProxy_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
PicklerMemoProxy_dealloc
4341
    PyObject_GC_Del((PyObject *)self);
inline
    
PyObject_GC_Del will not be inlined into PicklerMemoProxy_dealloc because its definition is unavailable 
PicklerMemoProxy_dealloc
4342
}
4343
4344
static int
4345
PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4346
                          visitproc visit, void *arg)
4347
{
4348
    Py_VISIT(self->pickler);
4349
    return 0;
4350
}
4351
4352
static int
4353
PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4354
{
4355
    Py_CLEAR(self->pickler);
4356
    return 0;
4357
}
4358
4359
static PyTypeObject PicklerMemoProxyType = {
4360
    PyVarObject_HEAD_INIT(NULL, 0)
4361
    "_pickle.PicklerMemoProxy",                 /*tp_name*/
4362
    sizeof(PicklerMemoProxyObject),             /*tp_basicsize*/
4363
    0,
4364
    (destructor)PicklerMemoProxy_dealloc,       /* tp_dealloc */
4365
    0,                                          /* tp_print */
4366
    0,                                          /* tp_getattr */
4367
    0,                                          /* tp_setattr */
4368
    0,                                          /* tp_compare */
4369
    0,                                          /* tp_repr */
4370
    0,                                          /* tp_as_number */
4371
    0,                                          /* tp_as_sequence */
4372
    0,                                          /* tp_as_mapping */
4373
    PyObject_HashNotImplemented,                /* tp_hash */
4374
    0,                                          /* tp_call */
4375
    0,                                          /* tp_str */
4376
    PyObject_GenericGetAttr,                    /* tp_getattro */
4377
    PyObject_GenericSetAttr,                    /* tp_setattro */
4378
    0,                                          /* tp_as_buffer */
4379
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4380
    0,                                          /* tp_doc */
4381
    (traverseproc)PicklerMemoProxy_traverse,    /* tp_traverse */
4382
    (inquiry)PicklerMemoProxy_clear,            /* tp_clear */
4383
    0,                                          /* tp_richcompare */
4384
    0,                                          /* tp_weaklistoffset */
4385
    0,                                          /* tp_iter */
4386
    0,                                          /* tp_iternext */
4387
    picklerproxy_methods,                       /* tp_methods */
4388
};
4389
4390
static PyObject *
4391
PicklerMemoProxy_New(PicklerObject *pickler)
4392
{
4393
    PicklerMemoProxyObject *self;
4394
4395
    self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
inline
           
_PyObject_GC_New will not be inlined into PicklerMemoProxy_New because its definition is unavailable 
PicklerMemoProxy_New
4396
    if (self == NULL)
4397
        return NULL;
4398
    Py_INCREF(pickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PicklerMemoProxy_New
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Pickler_get_memo
4399
    self->pickler = pickler;
4400
    PyObject_GC_Track(self);
inline
    
PyObject_GC_Track will not be inlined into PicklerMemoProxy_New because its definition is unavailable 
PicklerMemoProxy_New
4401
    return (PyObject *)self;
4402
}
4403
4404
/*****************************************************************************/
4405
4406
static PyObject *
4407
Pickler_get_memo(PicklerObject *self)
4408
{
4409
    return PicklerMemoProxy_New(self);
inline
           
PicklerMemoProxy_New can be inlined into Pickler_get_memo with cost=-14935 (threshold=250) 
Pickler_get_memo
inline
           
PicklerMemoProxy_New inlined into Pickler_get_memo 
Pickler_get_memo
4410
}
4411
4412
static int
4413
Pickler_set_memo(PicklerObject *self, PyObject *obj)
4414
{
4415
    PyMemoTable *new_memo = NULL;
4416
4417
    if (obj == NULL) {
4418
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
4419
                        "attribute deletion is not supported");
4420
        return -1;
4421
    }
4422
4423
    if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4424
        PicklerObject *pickler =
4425
            ((PicklerMemoProxyObject *)obj)->pickler;
4426
4427
        new_memo = PyMemoTable_Copy(pickler->memo);
inline
                   
PyMemoTable_Copy can be inlined into Pickler_set_memo with cost=-14535 (threshold=250) 
Pickler_set_memo
inline
                   
PyMemoTable_Copy inlined into Pickler_set_memo 
Pickler_set_memo
4428
        if (new_memo == NULL)
4429
            return -1;
4430
    }
4431
    else if (PyDict_Check(obj)) {
4432
        Py_ssize_t i = 0;
4433
        PyObject *key, *value;
4434
4435
        new_memo = PyMemoTable_New();
inline
                   
PyMemoTable_New can be inlined into Pickler_set_memo with cost=-14820 (threshold=250) 
Pickler_set_memo
inline
                   
PyMemoTable_New inlined into Pickler_set_memo 
Pickler_set_memo
4436
        if (new_memo == NULL)
4437
            return -1;
4438
4439
        while (PyDict_Next(obj, &i, &key, &value)) {
inline
               
PyDict_Next will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
Pickler_set_memo
loop-vectorize
        
loop not vectorized 
Pickler_set_memo
4440
            Py_ssize_t memo_id;
4441
            PyObject *memo_obj;
4442
4443
            if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
licm
                 
failed to move load with loop-invariant address because the loop may invalidate its value 
Pickler_set_memo
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_set_memo
4444
                PyErr_SetString(PyExc_TypeError,
inline
                
PyErr_SetString will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_set_memo
4445
                                "'memo' values must be 2-item tuples");
4446
                goto error;
4447
            }
4448
            memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
inline
                      
PyLong_AsSsize_t will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
4449
            if (memo_id == -1 && PyErr_Occurred())
inline
                                 
PyErr_Occurred will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
4450
                goto error;
4451
            memo_obj = PyTuple_GET_ITEM(value, 1);
licm
                       
hosting bitcast 
Pickler_set_memo
licm
                       
failed to move load with loop-invariant address because the loop may invalidate its value 
Pickler_set_memo
gvn
                       
load of type %struct.PyTupleObject* not eliminated because it is clobbered by call 
Pickler_set_memo
gvn
                       
load of type %struct.PyTupleObject* not eliminated because it is clobbered by call 
Pickler_set_memo
4452
            if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
inline
                
PyMemoTable_Set too costly to inline (cost=545, threshold=250) 
Pickler_set_memo
inline
                
PyMemoTable_Set will not be inlined into Pickler_set_memo 
Pickler_set_memo
4453
                goto error;
4454
        }
4455
    }
4456
    else {
4457
        PyErr_Format(PyExc_TypeError,
inline
        
PyErr_Format will not be inlined into Pickler_set_memo because its definition is unavailable 
Pickler_set_memo
4458
                     "'memo' attribute must be a PicklerMemoProxy object"
4459
                     "or dict, not %.200s", Py_TYPE(obj)->tp_name);
4460
        return -1;
4461
    }
4462
4463
    PyMemoTable_Del(self->memo);
inline
    
PyMemoTable_Del can be inlined into Pickler_set_memo with cost=180 (threshold=250) 
Pickler_set_memo
inline
    
PyMemoTable_Del inlined into Pickler_set_memo 
Pickler_set_memo
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_set_memo
gvn
                          
load of type %struct.PyMemoTable* not eliminated because it is clobbered by call 
Pickler_set_memo
4464
    self->memo = new_memo;
4465
4466
    return 0;
4467
4468
  error:
4469
    if (new_memo)
4470
        PyMemoTable_Del(new_memo);
inline
        
PyMemoTable_Del can be inlined into Pickler_set_memo with cost=-14830 (threshold=250) 
Pickler_set_memo
inline
        
PyMemoTable_Del inlined into Pickler_set_memo 
Pickler_set_memo
4471
    return -1;
4472
}
4473
4474
static PyObject *
4475
Pickler_get_persid(PicklerObject *self)
4476
{
4477
    if (self->pers_func == NULL)
4478
        PyErr_SetString(PyExc_AttributeError, "persistent_id");
inline
        
PyErr_SetString will not be inlined into Pickler_get_persid because its definition is unavailable 
Pickler_get_persid
4479
    else
4480
        Py_INCREF(self->pers_func);
4481
    return self->pers_func;
gvn
                 
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
Pickler_get_persid
gvn
                 
load eliminated by PRE 
Pickler_get_persid
4482
}
4483
4484
static int
4485
Pickler_set_persid(PicklerObject *self, PyObject *value)
4486
{
4487
    if (value == NULL) {
4488
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Pickler_set_persid because its definition is unavailable 
Pickler_set_persid
4489
                        "attribute deletion is not supported");
4490
        return -1;
4491
    }
4492
    if (!PyCallable_Check(value)) {
inline
         
PyCallable_Check will not be inlined into Pickler_set_persid because its definition is unavailable 
Pickler_set_persid
4493
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Pickler_set_persid because its definition is unavailable 
Pickler_set_persid
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_set_persid
4494
                        "persistent_id must be a callable taking one argument");
4495
        return -1;
4496
    }
4497
4498
    Py_INCREF(value);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Pickler_set_persid
4499
    Py_XSETREF(self->pers_func, value);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Pickler_set_persid
gvn
    
load of type i64 not eliminated because it is clobbered by store 
Pickler_set_persid
4500
4501
    return 0;
4502
}
4503
4504
static PyMemberDef Pickler_members[] = {
4505
    {"bin", T_INT, offsetof(PicklerObject, bin)},
4506
    {"fast", T_INT, offsetof(PicklerObject, fast)},
4507
    {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
4508
    {NULL}
4509
};
4510
4511
static PyGetSetDef Pickler_getsets[] = {
4512
    {"memo",          (getter)Pickler_get_memo,
4513
                      (setter)Pickler_set_memo},
4514
    {"persistent_id", (getter)Pickler_get_persid,
4515
                      (setter)Pickler_set_persid},
4516
    {NULL}
4517
};
4518
4519
static PyTypeObject Pickler_Type = {
4520
    PyVarObject_HEAD_INIT(NULL, 0)
4521
    "_pickle.Pickler"  ,                /*tp_name*/
4522
    sizeof(PicklerObject),              /*tp_basicsize*/
4523
    0,                                  /*tp_itemsize*/
4524
    (destructor)Pickler_dealloc,        /*tp_dealloc*/
4525
    0,                                  /*tp_print*/
4526
    0,                                  /*tp_getattr*/
4527
    0,                                  /*tp_setattr*/
4528
    0,                                  /*tp_reserved*/
4529
    0,                                  /*tp_repr*/
4530
    0,                                  /*tp_as_number*/
4531
    0,                                  /*tp_as_sequence*/
4532
    0,                                  /*tp_as_mapping*/
4533
    0,                                  /*tp_hash*/
4534
    0,                                  /*tp_call*/
4535
    0,                                  /*tp_str*/
4536
    0,                                  /*tp_getattro*/
4537
    0,                                  /*tp_setattro*/
4538
    0,                                  /*tp_as_buffer*/
4539
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4540
    _pickle_Pickler___init____doc__,    /*tp_doc*/
4541
    (traverseproc)Pickler_traverse,     /*tp_traverse*/
4542
    (inquiry)Pickler_clear,             /*tp_clear*/
4543
    0,                                  /*tp_richcompare*/
4544
    0,                                  /*tp_weaklistoffset*/
4545
    0,                                  /*tp_iter*/
4546
    0,                                  /*tp_iternext*/
4547
    Pickler_methods,                    /*tp_methods*/
4548
    Pickler_members,                    /*tp_members*/
4549
    Pickler_getsets,                    /*tp_getset*/
4550
    0,                                  /*tp_base*/
4551
    0,                                  /*tp_dict*/
4552
    0,                                  /*tp_descr_get*/
4553
    0,                                  /*tp_descr_set*/
4554
    0,                                  /*tp_dictoffset*/
4555
    _pickle_Pickler___init__,           /*tp_init*/
4556
    PyType_GenericAlloc,                /*tp_alloc*/
4557
    PyType_GenericNew,                  /*tp_new*/
4558
    PyObject_GC_Del,                    /*tp_free*/
4559
    0,                                  /*tp_is_gc*/
4560
};
4561
4562
/* Temporary helper for calling self.find_class().
4563
4564
   XXX: It would be nice to able to avoid Python function call overhead, by
4565
   using directly the C version of find_class(), when find_class() is not
4566
   overridden by a subclass. Although, this could become rather hackish. A
4567
   simpler optimization would be to call the C function when self is not a
4568
   subclass instance. */
4569
static PyObject *
4570
find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4571
{
4572
    _Py_IDENTIFIER(find_class);
4573
4574
    return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
inline
           
_PyObject_CallMethodId will not be inlined into find_class because its definition is unavailable 
find_class
licm
                                  
hosting getelementptr 
load
4575
                                  module_name, global_name);
4576
}
4577
4578
static Py_ssize_t
4579
marker(UnpicklerObject *self)
4580
{
4581
    Py_ssize_t mark;
4582
4583
    if (self->num_marks < 1) {
licm
              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
4584
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into marker with cost=40 (threshold=375) 
marker
inline
                          
_Pickle_GetGlobalState inlined into marker 
marker
4585
        PyErr_SetString(st->UnpicklingError, "could not find MARK");
inline
        
PyErr_SetString will not be inlined into marker because its definition is unavailable 
marker
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
marker
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_tuple
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_list
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_dict
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_additems
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_frozenset
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_obj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_inst
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_appends
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_pop_mark
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_setitems
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
4586
        return -1;
4587
    }
4588
4589
    mark = self->marks[--self->num_marks];
gvn
           
load of type i64 not eliminated because it is clobbered by store 
marker
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_tuple
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_list
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_dict
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_additems
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_frozenset
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_inst
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_appends
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_pop_mark
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load_setitems
licm
                 
hosting getelementptr 
load
licm
                 
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                 
load of type i64* not eliminated because it is clobbered by call 
load
gvn
           
load of type i64 not eliminated because it is clobbered by store 
load
4590
    self->stack->mark_set = self->num_marks != 0;
licm
          
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4591
    self->stack->fence = self->num_marks ?
gvn
                               
load of type i64 eliminated in favor of add 
marker
4592
            self->marks[self->num_marks - 1] : 0;
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_tuple
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_list
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_dict
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_additems
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_frozenset
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_inst
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_appends
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_pop_mark
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load_setitems
gvn
            
load of type i64 not eliminated because it is clobbered by store 
load
4593
    return mark;
4594
}
4595
4596
static int
4597
load_none(UnpicklerObject *self)
4598
{
4599
    PDATA_APPEND(self->stack, Py_None, -1);
inline
    
Pdata_push can be inlined into load_none with cost=150 (threshold=250) 
load_none
inline
    
Pdata_push inlined into load_none 
load_none
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
4600
    return 0;
4601
}
4602
4603
static int
4604
load_int(UnpicklerObject *self)
4605
{
4606
    PyObject *value;
4607
    char *endptr, *s;
licm
    
hosting bitcast 
load
4608
    Py_ssize_t len;
4609
    long x;
4610
4611
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_int
inline
               
_Unpickler_Readline will not be inlined into load_int 
load_int
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
4612
        return -1;
4613
    if (len < 2)
4614
        return bad_readline();
inline
               
bad_readline can be inlined into load_int with cost=85 (threshold=375) 
load_int
inline
               
bad_readline inlined into load_int 
load_int
4615
4616
    errno = 0;
inline
    
__errno_location will not be inlined into load_int because its definition is unavailable 
load_int
4617
    /* XXX: Should the base argument of strtol() be explicitly set to 10?
4618
       XXX(avassalotti): Should this uses PyOS_strtol()? */
4619
    x = strtol(s, &endptr, 0);
inline
        
strtol will not be inlined into load_int because its definition is unavailable 
load_int
gvn
               
load of type i8* not eliminated because it is clobbered by call 
load_int
licm
               
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
               
load of type i8* not eliminated because it is clobbered by call 
load
4620
4621
    if (errno || (*endptr != '\n' && *endptr != '\0')) {
gvn
        
load of type i32 not eliminated in favor of store because it is clobbered by call 
load_int
gvn
                   
load of type i8* not eliminated because it is clobbered by call 
load_int
licm
                   
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type i32 not eliminated in favor of store because it is clobbered by call 
load
gvn
                   
load of type i8* not eliminated because it is clobbered by call 
load
4622
        /* Hm, maybe we've got something long.  Let's try reading
4623
         * it as a Python int object. */
4624
        errno = 0;
4625
        /* XXX: Same thing about the base here. */
4626
        value = PyLong_FromString(s, NULL, 0);
inline
                
PyLong_FromString will not be inlined into load_int because its definition is unavailable 
load_int
gvn
                                  
load of type i8* eliminated in favor of load 
load_int
4627
        if (value == NULL) {
4628
            PyErr_SetString(PyExc_ValueError,
inline
            
PyErr_SetString will not be inlined into load_int because its definition is unavailable 
load_int
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_int
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
4629
                            "could not convert string to int");
4630
            return -1;
4631
        }
4632
    }
4633
    else {
4634
        if (len == 3 && (x == 0 || x == 1)) {
4635
            if ((value = PyBool_FromLong(x)) == NULL)
inline
                         
PyBool_FromLong will not be inlined into load_int because its definition is unavailable 
load_int
4636
                return -1;
4637
        }
4638
        else {
4639
            if ((value = PyLong_FromLong(x)) == NULL)
inline
                         
PyLong_FromLong will not be inlined into load_int because its definition is unavailable 
load_int
4640
                return -1;
4641
        }
4642
    }
4643
4644
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_int with cost=150 (threshold=250) 
load_int
inline
    
Pdata_push inlined into load_int 
load_int
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_int
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_int
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_int
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4645
    return 0;
4646
}
4647
4648
static int
4649
load_bool(UnpicklerObject *self, PyObject *boolean)
4650
{
4651
    assert(boolean == Py_True || boolean == Py_False);
4652
    PDATA_APPEND(self->stack, boolean, -1);
inline
    
Pdata_push can be inlined into load_bool with cost=150 (threshold=250) 
load_bool
inline
    
Pdata_push inlined into load_bool 
load_bool
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
4653
    return 0;
4654
}
4655
4656
/* s contains x bytes of an unsigned little-endian integer.  Return its value
4657
 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4658
 */
4659
static Py_ssize_t
4660
calc_binsize(char *bytes, int nbytes)
4661
{
4662
    unsigned char *s = (unsigned char *)bytes;
4663
    int i;
4664
    size_t x = 0;
4665
4666
    if (nbytes > (int)sizeof(size_t)) {
4667
        /* Check for integer overflow.  BINBYTES8 and BINUNICODE8 opcodes
4668
         * have 64-bit size that can't be represented on 32-bit platform.
4669
         */
4670
        for (i = (int)sizeof(size_t); i < nbytes; i++) {
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load_counted_binbytes
loop-vectorize
        
loop not vectorized 
load_counted_binbytes
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load_counted_binstring
loop-vectorize
        
loop not vectorized 
load_counted_binstring
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load_counted_binunicode
loop-vectorize
        
loop not vectorized 
load_counted_binunicode
4671
            if (s[i])
4672
                return -1;
4673
        }
4674
        nbytes = (int)sizeof(size_t);
4675
    }
4676
    for (i = 0; i < nbytes; i++) {
loop-unroll
    
completely unrolled loop with 4 iterations 
load_long_binget
loop-unroll
    
completely unrolled loop with 4 iterations 
load_long_binput
loop-unroll
    
completely unrolled loop with 8 iterations 
load_frame
loop-vectorize
    
loop not vectorized: vectorization is not beneficial and is not explicitly forced 
load_counted_binbytes
loop-unroll
    
completely unrolled loop with 8 iterations 
load_counted_binbytes
loop-vectorize
    
loop not vectorized: vectorization is not beneficial and is not explicitly forced 
load_counted_binstring
loop-unroll
    
completely unrolled loop with 8 iterations 
load_counted_binstring
loop-vectorize
    
loop not vectorized: vectorization is not beneficial and is not explicitly forced 
load_counted_binunicode
loop-unroll
    
completely unrolled loop with 8 iterations 
load_counted_binunicode
4677
        x |= (size_t) s[i] << (8 * i);
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_counted_binbytes
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_counted_binstring
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_counted_binunicode
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_long_binget
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_long_binput
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load_frame
gvn
                      
load of type i8 not eliminated because it is clobbered by store 
load
4678
    }
4679
4680
    if (x > PY_SSIZE_T_MAX)
4681
        return -1;
4682
    else
4683
        return (Py_ssize_t) x;
4684
}
4685
4686
/* s contains x bytes of a little-endian integer.  Return its value as a
4687
 * C int.  Obscure:  when x is 1 or 2, this is an unsigned little-endian
4688
 * int, but when x is 4 it's a signed one.  This is a historical source
4689
 * of x-platform bugs.
4690
 */
4691
static long
4692
calc_binint(char *bytes, int nbytes)
4693
{
4694
    unsigned char *s = (unsigned char *)bytes;
4695
    Py_ssize_t i;
4696
    long x = 0;
4697
4698
    for (i = 0; i < nbytes; i++) {
loop-unroll
    
completely unrolled loop with 1 iterations 
load_binint1
loop-unroll
    
completely unrolled loop with 2 iterations 
load_binint2
loop-unroll
    
completely unrolled loop with 4 iterations 
load
loop-vectorize
    
vectorized loop (vectorization width: 2, interleaved count: 2) 
load_counted_long
loop-unroll
    
unrolled loop by a factor of 2 with run-time trip count 
load_counted_long
loop-vectorize
    
vectorized loop (vectorization width: 2, interleaved count: 2) 
load_extension
loop-unroll
    
unrolled loop by a factor of 2 with run-time trip count 
load_extension
4699
        x |= (long)s[i] << (8 * i);
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
load_binint1
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
load_binint2
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
load_counted_long
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
load_extension
gvn
                   
load of type i8 not eliminated because it is clobbered by store 
load
4700
    }
4701
4702
    /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4703
     * is signed, so on a box with longs bigger than 4 bytes we need
4704
     * to extend a BININT's sign bit to the full width.
4705
     */
4706
    if (SIZEOF_LONG > 4 && nbytes == 4) {
4707
        x |= -(x & (1L << 31));
4708
    }
4709
4710
    return x;
4711
}
4712
4713
static int
4714
load_binintx(UnpicklerObject *self, char *s, int size)
4715
{
4716
    PyObject *value;
4717
    long x;
4718
4719
    x = calc_binint(s, size);
inline
        
calc_binint can be inlined into load_binintx with cost=45 (threshold=250) 
load_binintx
inline
        
calc_binint inlined into load_binintx 
load_binintx
4720
4721
    if ((value = PyLong_FromLong(x)) == NULL)
inline
                 
PyLong_FromLong will not be inlined into load_binintx because its definition is unavailable 
load_binintx
4722
        return -1;
4723
4724
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_binintx with cost=150 (threshold=250) 
load_binintx
inline
    
Pdata_push inlined into load_binintx 
load_binintx
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binintx
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binint1
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binint2
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4725
    return 0;
4726
}
4727
4728
static int
4729
load_binint(UnpicklerObject *self)
4730
{
4731
    char *s;
4732
4733
    if (_Unpickler_Read(self, &s, 4) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binint with cost=230 (threshold=250) 
load_binint
inline
        
_Unpickler_ReadImpl inlined into load_binint 
load_binint
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
4734
        return -1;
4735
4736
    return load_binintx(self, s, 4);
inline
           
load_binintx too costly to inline (cost=255, threshold=250) 
load_binint
inline
           
load_binintx will not be inlined into load_binint 
load_binint
inline
           
load_binintx can be inlined into load with cost=-14745 (threshold=250) 
load
inline
           
load_binintx inlined into load 
load
4737
}
4738
4739
static int
4740
load_binint1(UnpicklerObject *self)
4741
{
4742
    char *s;
4743
4744
    if (_Unpickler_Read(self, &s, 1) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binint1 with cost=230 (threshold=250) 
load_binint1
inline
        
_Unpickler_ReadImpl inlined into load_binint1 
load_binint1
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
4745
        return -1;
4746
4747
    return load_binintx(self, s, 1);
inline
           
load_binintx can be inlined into load_binint1 with cost=240 (threshold=250) 
load_binint1
inline
           
load_binintx inlined into load_binint1 
load_binint1
4748
}
4749
4750
static int
4751
load_binint2(UnpicklerObject *self)
4752
{
4753
    char *s;
4754
4755
    if (_Unpickler_Read(self, &s, 2) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binint2 with cost=230 (threshold=250) 
load_binint2
inline
        
_Unpickler_ReadImpl inlined into load_binint2 
load_binint2
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
4756
        return -1;
4757
4758
    return load_binintx(self, s, 2);
inline
           
load_binintx can be inlined into load_binint2 with cost=240 (threshold=250) 
load_binint2
inline
           
load_binintx inlined into load_binint2 
load_binint2
4759
}
4760
4761
static int
4762
load_long(UnpicklerObject *self)
4763
{
4764
    PyObject *value;
4765
    char *s;
licm
    
hosting bitcast 
load
4766
    Py_ssize_t len;
4767
4768
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_long
inline
               
_Unpickler_Readline will not be inlined into load_long 
load_long
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
4769
        return -1;
4770
    if (len < 2)
4771
        return bad_readline();
inline
               
bad_readline can be inlined into load_long with cost=85 (threshold=375) 
load_long
inline
               
bad_readline inlined into load_long 
load_long
4772
4773
    /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4774
       the 'L' before calling PyLong_FromString.  In order to maintain
4775
       compatibility with Python 3.0.0, we don't actually *require*
4776
       the 'L' to be present. */
4777
    if (s[len-2] == 'L')
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load_long
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load
4778
        s[len-2] = '\0';
4779
    /* XXX: Should the base argument explicitly set to 10? */
4780
    value = PyLong_FromString(s, NULL, 0);
inline
            
PyLong_FromString will not be inlined into load_long because its definition is unavailable 
load_long
gvn
                              
load of type i8* eliminated in favor of load 
load_long
4781
    if (value == NULL)
4782
        return -1;
4783
4784
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_long with cost=150 (threshold=250) 
load_long
inline
    
Pdata_push inlined into load_long 
load_long
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_long
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4785
    return 0;
4786
}
4787
4788
/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4789
 * data following.
4790
 */
4791
static int
4792
load_counted_long(UnpicklerObject *self, int size)
4793
{
4794
    PyObject *value;
4795
    char *nbytes;
4796
    char *pdata;
4797
4798
    assert(size == 1 || size == 4);
4799
    if (_Unpickler_Read(self, &nbytes, size) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_long with cost=235 (threshold=250) 
load_counted_long
inline
        
_Unpickler_ReadImpl inlined into load_counted_long 
load_counted_long
4800
        return -1;
4801
4802
    size = calc_binint(nbytes, size);
inline
           
calc_binint can be inlined into load_counted_long with cost=45 (threshold=250) 
load_counted_long
inline
           
calc_binint inlined into load_counted_long 
load_counted_long
4803
    if (size < 0) {
4804
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_counted_long with cost=40 (threshold=375) 
load_counted_long
inline
                          
_Pickle_GetGlobalState inlined into load_counted_long 
load_counted_long
4805
        /* Corrupt or hostile pickle -- we never write one like this */
4806
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_counted_long because its definition is unavailable 
load_counted_long
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_long
4807
                        "LONG pickle has negative byte count");
4808
        return -1;
4809
    }
4810
4811
    if (size == 0)
4812
        value = PyLong_FromLong(0L);
inline
                
PyLong_FromLong will not be inlined into load_counted_long because its definition is unavailable 
load_counted_long
4813
    else {
4814
        /* Read the raw little-endian bytes and convert. */
4815
        if (_Unpickler_Read(self, &pdata, size) < 0)
inline
            
_Unpickler_ReadImpl can be inlined into load_counted_long with cost=235 (threshold=250) 
load_counted_long
inline
            
_Unpickler_ReadImpl inlined into load_counted_long 
load_counted_long
gvn
            
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_counted_long
gvn
            
load of type i64 eliminated in favor of phi 
load_counted_long
gvn
            
load of type i8* eliminated in favor of phi 
load_counted_long
4816
            return -1;
4817
        value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
inline
                
_PyLong_FromByteArray will not be inlined into load_counted_long because its definition is unavailable 
load_counted_long
4818
                                      1 /* little endian */ , 1 /* signed */ );
4819
    }
4820
    if (value == NULL)
4821
        return -1;
4822
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_counted_long with cost=150 (threshold=250) 
load_counted_long
inline
    
Pdata_push inlined into load_counted_long 
load_counted_long
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_long
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_long
4823
    return 0;
4824
}
4825
4826
static int
4827
load_float(UnpicklerObject *self)
4828
{
4829
    PyObject *value;
4830
    char *endptr, *s;
licm
    
hosting bitcast 
load
4831
    Py_ssize_t len;
4832
    double d;
4833
4834
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_float
inline
               
_Unpickler_Readline will not be inlined into load_float 
load_float
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
4835
        return -1;
4836
    if (len < 2)
4837
        return bad_readline();
inline
               
bad_readline can be inlined into load_float with cost=85 (threshold=375) 
load_float
inline
               
bad_readline inlined into load_float 
load_float
4838
4839
    errno = 0;
inline
    
__errno_location will not be inlined into load_float because its definition is unavailable 
load_float
4840
    d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
inline
        
PyOS_string_to_double will not be inlined into load_float because its definition is unavailable 
load_float
gvn
                              
load of type i8* not eliminated because it is clobbered by call 
load_float
gvn
                                          
load of type %struct._object* not eliminated because it is clobbered by call 
load_float
licm
                              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
                                          
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                              
load of type i8* not eliminated because it is clobbered by call 
load
gvn
                                          
load of type %struct._object* not eliminated because it is clobbered by call 
load
4841
    if (d == -1.0 && PyErr_Occurred())
inline
                     
PyErr_Occurred will not be inlined into load_float because its definition is unavailable 
load_float
4842
        return -1;
4843
    if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
gvn
         
load of type i8* not eliminated because it is clobbered by call 
load_float
gvn
         
load of type i8* not eliminated because it is clobbered by call 
load_float
licm
         
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
         
load of type i8* not eliminated because it is clobbered by call 
load
gvn
         
load of type i8* not eliminated because it is clobbered by call 
load
4844
        PyErr_SetString(PyExc_ValueError, "could not convert string to float");
inline
        
PyErr_SetString will not be inlined into load_float because its definition is unavailable 
load_float
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_float
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load_float
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
load
4845
        return -1;
4846
    }
4847
    value = PyFloat_FromDouble(d);
inline
            
PyFloat_FromDouble will not be inlined into load_float because its definition is unavailable 
load_float
4848
    if (value == NULL)
4849
        return -1;
4850
4851
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_float with cost=150 (threshold=250) 
load_float
inline
    
Pdata_push inlined into load_float 
load_float
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_float
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4852
    return 0;
4853
}
4854
4855
static int
4856
load_binfloat(UnpicklerObject *self)
4857
{
4858
    PyObject *value;
4859
    double x;
4860
    char *s;
4861
4862
    if (_Unpickler_Read(self, &s, 8) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binfloat with cost=230 (threshold=250) 
load_binfloat
inline
        
_Unpickler_ReadImpl inlined into load_binfloat 
load_binfloat
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
4863
        return -1;
4864
4865
    x = _PyFloat_Unpack8((unsigned char *)s, 0);
inline
        
_PyFloat_Unpack8 will not be inlined into load_binfloat because its definition is unavailable 
load_binfloat
4866
    if (x == -1.0 && PyErr_Occurred())
inline
                     
PyErr_Occurred will not be inlined into load_binfloat because its definition is unavailable 
load_binfloat
4867
        return -1;
4868
4869
    if ((value = PyFloat_FromDouble(x)) == NULL)
inline
                 
PyFloat_FromDouble will not be inlined into load_binfloat because its definition is unavailable 
load_binfloat
4870
        return -1;
4871
4872
    PDATA_PUSH(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_binfloat with cost=150 (threshold=250) 
load_binfloat
inline
    
Pdata_push inlined into load_binfloat 
load_binfloat
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binfloat
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4873
    return 0;
4874
}
4875
4876
static int
4877
load_string(UnpicklerObject *self)
4878
{
4879
    PyObject *bytes;
4880
    PyObject *obj;
4881
    Py_ssize_t len;
4882
    char *s, *p;
licm
    
hosting bitcast 
load
4883
4884
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_string
inline
               
_Unpickler_Readline will not be inlined into load_string 
load_string
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
4885
        return -1;
4886
    /* Strip the newline */
4887
    len--;
4888
    /* Strip outermost quotes */
4889
    if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
gvn
                    
load of type i8* not eliminated because it is clobbered by call 
load_string
licm
                    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                    
load of type i8* not eliminated because it is clobbered by call 
load
4890
        p = s + 1;
4891
        len -= 2;
4892
    }
4893
    else {
4894
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_string with cost=40 (threshold=375) 
load_string
inline
                          
_Pickle_GetGlobalState inlined into load_string 
load_string
4895
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_string because its definition is unavailable 
load_string
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_string
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
4896
                        "the STRING opcode argument must be quoted");
4897
        return -1;
4898
    }
4899
    assert(len >= 0);
4900
4901
    /* Use the PyBytes API to decode the string, since that is what is used
4902
       to encode, and then coerce the result to Unicode. */
4903
    bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
inline
            
PyBytes_DecodeEscape will not be inlined into load_string because its definition is unavailable 
load_string
4904
    if (bytes == NULL)
4905
        return -1;
4906
4907
    /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4908
       Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4909
    if (strcmp(self->encoding, "bytes") == 0) {
inline
        
strcmp will not be inlined into load_string because its definition is unavailable 
load_string
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load_string
licm
        
hosting getelementptr 
load
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load
4910
        obj = bytes;
4911
    }
4912
    else {
4913
        obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
inline
              
PyUnicode_FromEncodedObject will not be inlined into load_string because its definition is unavailable 
load_string
gvn
                                                                       
load of type i8* not eliminated because it is clobbered by call 
load_string
licm
                                                                       
hosting getelementptr 
load
licm
                                                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                                                       
load of type i8* not eliminated because it is clobbered by call 
load
4914
        Py_DECREF(bytes);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_string
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_string
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
4915
        if (obj == NULL) {
4916
            return -1;
4917
        }
4918
    }
4919
4920
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_string with cost=150 (threshold=250) 
load_string
inline
    
Pdata_push inlined into load_string 
load_string
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_string
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_string
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_string
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
4921
    return 0;
4922
}
4923
4924
static int
4925
load_counted_binstring(UnpicklerObject *self, int nbytes)
4926
{
4927
    PyObject *obj;
4928
    Py_ssize_t size;
4929
    char *s;
4930
4931
    if (_Unpickler_Read(self, &s, nbytes) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binstring with cost=235 (threshold=250) 
load_counted_binstring
inline
        
_Unpickler_ReadImpl inlined into load_counted_binstring 
load_counted_binstring
4932
        return -1;
4933
4934
    size = calc_binsize(s, nbytes);
inline
           
calc_binsize can be inlined into load_counted_binstring with cost=80 (threshold=250) 
load_counted_binstring
inline
           
calc_binsize inlined into load_counted_binstring 
load_counted_binstring
4935
    if (size < 0) {
4936
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_counted_binstring with cost=40 (threshold=375) 
load_counted_binstring
inline
                          
_Pickle_GetGlobalState inlined into load_counted_binstring 
load_counted_binstring
4937
        PyErr_Format(st->UnpicklingError,
inline
        
PyErr_Format will not be inlined into load_counted_binstring because its definition is unavailable 
load_counted_binstring
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binstring
4938
                     "BINSTRING exceeds system's maximum size of %zd bytes",
4939
                     PY_SSIZE_T_MAX);
4940
        return -1;
4941
    }
4942
4943
    if (_Unpickler_Read(self, &s, size) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binstring with cost=235 (threshold=250) 
load_counted_binstring
inline
        
_Unpickler_ReadImpl inlined into load_counted_binstring 
load_counted_binstring
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_counted_binstring
gvn
        
load of type i64 eliminated in favor of phi 
load_counted_binstring
gvn
        
load of type i8* eliminated in favor of phi 
load_counted_binstring
4944
        return -1;
4945
4946
    /* Convert Python 2.x strings to bytes if the *encoding* given to the
4947
       Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4948
    if (strcmp(self->encoding, "bytes") == 0) {
inline
        
strcmp will not be inlined into load_counted_binstring because its definition is unavailable 
load_counted_binstring
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load_counted_binstring
4949
        obj = PyBytes_FromStringAndSize(s, size);
inline
              
PyBytes_FromStringAndSize will not be inlined into load_counted_binstring because its definition is unavailable 
load_counted_binstring
4950
    }
4951
    else {
4952
        obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
inline
              
PyUnicode_Decode will not be inlined into load_counted_binstring because its definition is unavailable 
load_counted_binstring
gvn
                                                              
load of type i8* not eliminated because it is clobbered by call 
load_counted_binstring
4953
    }
4954
    if (obj == NULL) {
4955
        return -1;
4956
    }
4957
4958
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_counted_binstring with cost=150 (threshold=250) 
load_counted_binstring
inline
    
Pdata_push inlined into load_counted_binstring 
load_counted_binstring
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_binstring
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_binstring
4959
    return 0;
4960
}
4961
4962
static int
4963
load_counted_binbytes(UnpicklerObject *self, int nbytes)
4964
{
4965
    PyObject *bytes;
4966
    Py_ssize_t size;
4967
    char *s;
4968
4969
    if (_Unpickler_Read(self, &s, nbytes) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binbytes with cost=235 (threshold=250) 
load_counted_binbytes
inline
        
_Unpickler_ReadImpl inlined into load_counted_binbytes 
load_counted_binbytes
4970
        return -1;
4971
4972
    size = calc_binsize(s, nbytes);
inline
           
calc_binsize can be inlined into load_counted_binbytes with cost=80 (threshold=250) 
load_counted_binbytes
inline
           
calc_binsize inlined into load_counted_binbytes 
load_counted_binbytes
4973
    if (size < 0) {
4974
        PyErr_Format(PyExc_OverflowError,
inline
        
PyErr_Format will not be inlined into load_counted_binbytes because its definition is unavailable 
load_counted_binbytes
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binbytes
4975
                     "BINBYTES exceeds system's maximum size of %zd bytes",
4976
                     PY_SSIZE_T_MAX);
4977
        return -1;
4978
    }
4979
4980
    if (_Unpickler_Read(self, &s, size) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binbytes with cost=235 (threshold=250) 
load_counted_binbytes
inline
        
_Unpickler_ReadImpl inlined into load_counted_binbytes 
load_counted_binbytes
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_counted_binbytes
gvn
        
load of type i64 eliminated in favor of phi 
load_counted_binbytes
gvn
        
load of type i8* eliminated in favor of phi 
load_counted_binbytes
4981
        return -1;
4982
4983
    bytes = PyBytes_FromStringAndSize(s, size);
inline
            
PyBytes_FromStringAndSize will not be inlined into load_counted_binbytes because its definition is unavailable 
load_counted_binbytes
4984
    if (bytes == NULL)
4985
        return -1;
4986
4987
    PDATA_PUSH(self->stack, bytes, -1);
inline
    
Pdata_push can be inlined into load_counted_binbytes with cost=150 (threshold=250) 
load_counted_binbytes
inline
    
Pdata_push inlined into load_counted_binbytes 
load_counted_binbytes
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_binbytes
4988
    return 0;
4989
}
4990
4991
static int
4992
load_unicode(UnpicklerObject *self)
4993
{
4994
    PyObject *str;
4995
    Py_ssize_t len;
4996
    char *s;
licm
    
hosting bitcast 
load
4997
4998
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_unicode
inline
               
_Unpickler_Readline will not be inlined into load_unicode 
load_unicode
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
4999
        return -1;
5000
    if (len < 1)
5001
        return bad_readline();
inline
               
bad_readline can be inlined into load_unicode with cost=85 (threshold=375) 
load_unicode
inline
               
bad_readline inlined into load_unicode 
load_unicode
5002
5003
    str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
inline
          
PyUnicode_DecodeRawUnicodeEscape will not be inlined into load_unicode because its definition is unavailable 
load_unicode
gvn
                                           
load of type i8* not eliminated because it is clobbered by call 
load_unicode
licm
                                           
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                           
load of type i8* not eliminated because it is clobbered by call 
load
5004
    if (str == NULL)
5005
        return -1;
5006
5007
    PDATA_PUSH(self->stack, str, -1);
inline
    
Pdata_push can be inlined into load_unicode with cost=150 (threshold=250) 
load_unicode
inline
    
Pdata_push inlined into load_unicode 
load_unicode
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_unicode
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5008
    return 0;
5009
}
5010
5011
static int
5012
load_counted_binunicode(UnpicklerObject *self, int nbytes)
5013
{
5014
    PyObject *str;
5015
    Py_ssize_t size;
5016
    char *s;
5017
5018
    if (_Unpickler_Read(self, &s, nbytes) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binunicode with cost=235 (threshold=250) 
load_counted_binunicode
inline
        
_Unpickler_ReadImpl inlined into load_counted_binunicode 
load_counted_binunicode
5019
        return -1;
5020
5021
    size = calc_binsize(s, nbytes);
inline
           
calc_binsize can be inlined into load_counted_binunicode with cost=80 (threshold=250) 
load_counted_binunicode
inline
           
calc_binsize inlined into load_counted_binunicode 
load_counted_binunicode
5022
    if (size < 0) {
5023
        PyErr_Format(PyExc_OverflowError,
inline
        
PyErr_Format will not be inlined into load_counted_binunicode because its definition is unavailable 
load_counted_binunicode
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_counted_binunicode
5024
                     "BINUNICODE exceeds system's maximum size of %zd bytes",
5025
                     PY_SSIZE_T_MAX);
5026
        return -1;
5027
    }
5028
5029
    if (_Unpickler_Read(self, &s, size) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_counted_binunicode with cost=235 (threshold=250) 
load_counted_binunicode
inline
        
_Unpickler_ReadImpl inlined into load_counted_binunicode 
load_counted_binunicode
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_counted_binunicode
gvn
        
load of type i64 eliminated in favor of phi 
load_counted_binunicode
gvn
        
load of type i8* eliminated in favor of phi 
load_counted_binunicode
5030
        return -1;
5031
5032
    str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
inline
          
PyUnicode_DecodeUTF8 will not be inlined into load_counted_binunicode because its definition is unavailable 
load_counted_binunicode
5033
    if (str == NULL)
5034
        return -1;
5035
5036
    PDATA_PUSH(self->stack, str, -1);
inline
    
Pdata_push can be inlined into load_counted_binunicode with cost=150 (threshold=250) 
load_counted_binunicode
inline
    
Pdata_push inlined into load_counted_binunicode 
load_counted_binunicode
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_counted_binunicode
5037
    return 0;
5038
}
5039
5040
static int
5041
load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
5042
{
5043
    PyObject *tuple;
5044
5045
    if (Py_SIZE(self->stack) < len)
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5046
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_counted_tuple with cost=95 (threshold=375) 
load_counted_tuple
inline
               
Pdata_stack_underflow inlined into load_counted_tuple 
load_counted_tuple
5047
5048
    tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
inline
            
Not inlining. Cost of inlining Pdata_poptuple increases the cost of inlining load_counted_tuple in other contexts 
load_counted_tuple
inline
            
Pdata_poptuple will not be inlined into load_counted_tuple 
load_counted_tuple
inline
            
Pdata_poptuple can be inlined into load_tuple with cost=220 (threshold=250) 
load_tuple
inline
            
Pdata_poptuple inlined into load_tuple 
load_tuple
inline
            
Pdata_poptuple can be inlined into load with cost=220 (threshold=250) 
load
inline
            
Pdata_poptuple inlined into load 
load
inline
            
Pdata_poptuple can be inlined into load with cost=-14780 (threshold=250) 
load
5049
    if (tuple == NULL)
5050
        return -1;
5051
    PDATA_PUSH(self->stack, tuple, -1);
inline
    
Not inlining. Cost of inlining Pdata_push increases the cost of inlining load_counted_tuple in other contexts 
load_counted_tuple
inline
    
Pdata_push will not be inlined into load_counted_tuple 
load_counted_tuple
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_counted_tuple
inline
    
Pdata_push can be inlined into load_tuple with cost=150 (threshold=250) 
load_tuple
inline
    
Pdata_push inlined into load_tuple 
load_tuple
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_tuple
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load_tuple
inline
    
Pdata_push can be inlined into load with cost=150 (threshold=250) 
load
inline
    
Pdata_push inlined into load 
load
inline
    
Pdata_push can be inlined into load with cost=-14850 (threshold=250) 
load
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by store 
load
5052
    return 0;
5053
}
5054
5055
static int
5056
load_tuple(UnpicklerObject *self)
5057
{
5058
    Py_ssize_t i;
5059
5060
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_tuple with cost=165 (threshold=250) 
load_tuple
inline
             
marker inlined into load_tuple 
load_tuple
5061
        return -1;
5062
5063
    return load_counted_tuple(self, Py_SIZE(self->stack) - i);
inline
           
load_counted_tuple can be inlined into load_tuple with cost=215 (threshold=250) 
load_tuple
inline
           
load_counted_tuple inlined into load_tuple 
load_tuple
gvn
                                    
load of type %struct.PyVarObject* eliminated in favor of inttoptr 
load_tuple
5064
}
5065
5066
static int
5067
load_empty_list(UnpicklerObject *self)
5068
{
5069
    PyObject *list;
5070
5071
    if ((list = PyList_New(0)) == NULL)
inline
                
PyList_New will not be inlined into load_empty_list because its definition is unavailable 
load_empty_list
5072
        return -1;
5073
    PDATA_PUSH(self->stack, list, -1);
inline
    
Pdata_push can be inlined into load_empty_list with cost=150 (threshold=250) 
load_empty_list
inline
    
Pdata_push inlined into load_empty_list 
load_empty_list
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_empty_list
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5074
    return 0;
5075
}
5076
5077
static int
5078
load_empty_dict(UnpicklerObject *self)
5079
{
5080
    PyObject *dict;
5081
5082
    if ((dict = PyDict_New()) == NULL)
inline
                
PyDict_New will not be inlined into load_empty_dict because its definition is unavailable 
load_empty_dict
5083
        return -1;
5084
    PDATA_PUSH(self->stack, dict, -1);
inline
    
Pdata_push can be inlined into load_empty_dict with cost=150 (threshold=250) 
load_empty_dict
inline
    
Pdata_push inlined into load_empty_dict 
load_empty_dict
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_empty_dict
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5085
    return 0;
5086
}
5087
5088
static int
5089
load_empty_set(UnpicklerObject *self)
5090
{
5091
    PyObject *set;
5092
5093
    if ((set = PySet_New(NULL)) == NULL)
inline
               
PySet_New will not be inlined into load_empty_set because its definition is unavailable 
load_empty_set
5094
        return -1;
5095
    PDATA_PUSH(self->stack, set, -1);
inline
    
Pdata_push can be inlined into load_empty_set with cost=150 (threshold=250) 
load_empty_set
inline
    
Pdata_push inlined into load_empty_set 
load_empty_set
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_empty_set
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5096
    return 0;
5097
}
5098
5099
static int
5100
load_list(UnpicklerObject *self)
5101
{
5102
    PyObject *list;
5103
    Py_ssize_t i;
5104
5105
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_list with cost=165 (threshold=250) 
load_list
inline
             
marker inlined into load_list 
load_list
5106
        return -1;
5107
5108
    list = Pdata_poplist(self->stack, i);
inline
           
Pdata_poplist can be inlined into load_list with cost=80 (threshold=250) 
load_list
inline
           
Pdata_poplist inlined into load_list 
load_list
gvn
                               
load of type %struct.Pdata* eliminated in favor of load 
load_list
5109
    if (list == NULL)
5110
        return -1;
5111
    PDATA_PUSH(self->stack, list, -1);
inline
    
Pdata_push can be inlined into load_list with cost=150 (threshold=250) 
load_list
inline
    
Pdata_push inlined into load_list 
load_list
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_list
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load_list
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by store 
load
5112
    return 0;
5113
}
5114
5115
static int
5116
load_dict(UnpicklerObject *self)
5117
{
5118
    PyObject *dict, *key, *value;
5119
    Py_ssize_t i, j, k;
5120
5121
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_dict with cost=165 (threshold=250) 
load_dict
inline
             
marker inlined into load_dict 
load_dict
5122
        return -1;
5123
    j = Py_SIZE(self->stack);
gvn
        
load of type %struct.PyVarObject* eliminated in favor of inttoptr 
load_dict
5124
5125
    if ((dict = PyDict_New()) == NULL)
inline
                
PyDict_New will not be inlined into load_dict because its definition is unavailable 
load_dict
5126
        return -1;
5127
5128
    if ((j - i) % 2 != 0) {
5129
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_dict with cost=40 (threshold=375) 
load_dict
inline
                          
_Pickle_GetGlobalState inlined into load_dict 
load_dict
5130
        PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
inline
        
PyErr_SetString will not be inlined into load_dict because its definition is unavailable 
load_dict
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_dict
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5131
        Py_DECREF(dict);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_dict
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_dict
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5132
        return -1;
5133
    }
5134
5135
    for (k = i + 1; k < j; k += 2) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
load
loop-vectorize
    
loop not vectorized 
load
5136
        key = self->stack->data[k - 1];
5137
        value = self->stack->data[k];
5138
        if (PyDict_SetItem(dict, key, value) < 0) {
inline
            
PyDict_SetItem will not be inlined into load_dict because its definition is unavailable 
load_dict
5139
            Py_DECREF(dict);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_dict
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_dict
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5140
            return -1;
5141
        }
5142
    }
5143
    Pdata_clear(self->stack, i);
inline
    
Pdata_clear can be inlined into load_dict with cost=85 (threshold=250) 
load_dict
inline
    
Pdata_clear inlined into load_dict 
load_dict
5144
    PDATA_PUSH(self->stack, dict, -1);
inline
    
Pdata_push can be inlined into load_dict with cost=150 (threshold=250) 
load_dict
inline
    
Pdata_push inlined into load_dict 
load_dict
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by store 
load_dict
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_dict
gvn
    
load eliminated by PRE 
load_dict
5145
    return 0;
5146
}
5147
5148
static int
5149
load_frozenset(UnpicklerObject *self)
5150
{
5151
    PyObject *items;
5152
    PyObject *frozenset;
5153
    Py_ssize_t i;
5154
5155
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_frozenset with cost=165 (threshold=250) 
load_frozenset
inline
             
marker inlined into load_frozenset 
load_frozenset
5156
        return -1;
5157
5158
    items = Pdata_poptuple(self->stack, i);
inline
            
Pdata_poptuple can be inlined into load_frozenset with cost=220 (threshold=250) 
load_frozenset
inline
            
Pdata_poptuple inlined into load_frozenset 
load_frozenset
gvn
                                 
load of type %struct.Pdata* eliminated in favor of load 
load_frozenset
5159
    if (items == NULL)
5160
        return -1;
5161
5162
    frozenset = PyFrozenSet_New(items);
inline
                
PyFrozenSet_New will not be inlined into load_frozenset because its definition is unavailable 
load_frozenset
5163
    Py_DECREF(items);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_frozenset
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_frozenset
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5164
    if (frozenset == NULL)
5165
        return -1;
5166
5167
    PDATA_PUSH(self->stack, frozenset, -1);
inline
    
Pdata_push can be inlined into load_frozenset with cost=150 (threshold=250) 
load_frozenset
inline
    
Pdata_push inlined into load_frozenset 
load_frozenset
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_frozenset
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_frozenset
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5168
    return 0;
5169
}
5170
5171
static PyObject *
5172
instantiate(PyObject *cls, PyObject *args)
5173
{
5174
    PyObject *result = NULL;
5175
    _Py_IDENTIFIER(__getinitargs__);
5176
    /* Caller must assure args are a tuple.  Normally, args come from
5177
       Pdata_poptuple which packs objects from the top of the stack
5178
       into a newly created tuple. */
5179
    assert(PyTuple_Check(args));
5180
    if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_inst
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load_inst
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
                              
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
5181
        _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
inline
        
_PyObject_HasAttrId will not be inlined into instantiate because its definition is unavailable 
instantiate
5182
        result = PyObject_CallObject(cls, args);
inline
                 
PyObject_CallObject will not be inlined into instantiate because its definition is unavailable 
instantiate
5183
    }
5184
    else {
5185
        _Py_IDENTIFIER(__new__);
5186
5187
        result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
inline
                 
_PyObject_CallMethodId will not be inlined into instantiate because its definition is unavailable 
instantiate
5188
    }
5189
    return result;
5190
}
5191
5192
static int
5193
load_obj(UnpicklerObject *self)
5194
{
5195
    PyObject *cls, *args, *obj = NULL;
5196
    Py_ssize_t i;
5197
5198
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_obj with cost=165 (threshold=250) 
load_obj
inline
             
marker inlined into load_obj 
load_obj
5199
        return -1;
5200
5201
    if (Py_SIZE(self->stack) - i < 1)
gvn
        
load of type %struct.Pdata* eliminated in favor of load 
load_obj
5202
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_obj with cost=95 (threshold=375) 
load_obj
inline
               
Pdata_stack_underflow inlined into load_obj 
load_obj
5203
5204
    args = Pdata_poptuple(self->stack, i + 1);
inline
           
Pdata_poptuple can be inlined into load_obj with cost=220 (threshold=250) 
load_obj
inline
           
Pdata_poptuple inlined into load_obj 
load_obj
5205
    if (args == NULL)
5206
        return -1;
5207
5208
    PDATA_POP(self->stack, cls);
inline
    
Pdata_pop can be inlined into load_obj with cost=140 (threshold=250) 
load_obj
inline
    
Pdata_pop inlined into load_obj 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load_obj
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by store 
load
5209
    if (cls) {
5210
        obj = instantiate(cls, args);
inline
              
instantiate can be inlined into load_obj with cost=135 (threshold=250) 
load_obj
inline
              
instantiate inlined into load_obj 
load_obj
5211
        Py_DECREF(cls);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_obj
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_obj
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5212
    }
5213
    Py_DECREF(args);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5214
    if (obj == NULL)
5215
        return -1;
5216
5217
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_obj with cost=150 (threshold=250) 
load_obj
inline
    
Pdata_push inlined into load_obj 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_obj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_obj
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5218
    return 0;
5219
}
5220
5221
static int
5222
load_inst(UnpicklerObject *self)
5223
{
5224
    PyObject *cls = NULL;
5225
    PyObject *args = NULL;
5226
    PyObject *obj = NULL;
5227
    PyObject *module_name;
5228
    PyObject *class_name;
5229
    Py_ssize_t len;
5230
    Py_ssize_t i;
5231
    char *s;
licm
    
hosting bitcast 
load
5232
5233
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_inst with cost=165 (threshold=250) 
load_inst
inline
             
marker inlined into load_inst 
load_inst
5234
        return -1;
5235
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_inst
inline
               
_Unpickler_Readline will not be inlined into load_inst 
load_inst
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5236
        return -1;
5237
    if (len < 2)
5238
        return bad_readline();
inline
               
bad_readline can be inlined into load_inst with cost=85 (threshold=375) 
load_inst
inline
               
bad_readline inlined into load_inst 
load_inst
5239
5240
    /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5241
       identifiers are permitted in Python 3.0, since the INST opcode is only
5242
       supported by older protocols on Python 2.x. */
5243
    module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
inline
                  
PyUnicode_DecodeASCII will not be inlined into load_inst because its definition is unavailable 
load_inst
gvn
                                        
load of type i8* not eliminated because it is clobbered by call 
load_inst
licm
                                        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                        
load of type i8* not eliminated because it is clobbered by call 
load
5244
    if (module_name == NULL)
5245
        return -1;
5246
5247
    if ((len = _Unpickler_Readline(self, &s)) >= 0) {
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_inst
inline
               
_Unpickler_Readline will not be inlined into load_inst 
load_inst
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5248
        if (len < 2) {
5249
            Py_DECREF(module_name);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5250
            return bad_readline();
inline
                   
bad_readline can be inlined into load_inst with cost=85 (threshold=375) 
load_inst
inline
                   
bad_readline inlined into load_inst 
load_inst
5251
        }
5252
        class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
inline
                     
PyUnicode_DecodeASCII will not be inlined into load_inst because its definition is unavailable 
load_inst
gvn
                                           
load of type i8* not eliminated in favor of load because it is clobbered by call 
load_inst
licm
                                           
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                           
load of type i8* not eliminated in favor of load because it is clobbered by call 
load
5253
        if (class_name != NULL) {
5254
            cls = find_class(self, module_name, class_name);
inline
                  
find_class can be inlined into load_inst with cost=10 (threshold=375) 
load_inst
inline
                  
find_class inlined into load_inst 
load_inst
5255
            Py_DECREF(class_name);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5256
        }
5257
    }
5258
    Py_DECREF(module_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5259
5260
    if (cls == NULL)
5261
        return -1;
5262
5263
    if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
inline
                
Pdata_poptuple can be inlined into load_inst with cost=220 (threshold=250) 
load_inst
inline
                
Pdata_poptuple inlined into load_inst 
load_inst
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_inst
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_inst
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_inst
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_inst
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_inst
licm
                                     
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                     
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5264
        obj = instantiate(cls, args);
inline
              
instantiate can be inlined into load_inst with cost=-14865 (threshold=250) 
load_inst
inline
              
instantiate inlined into load_inst 
load_inst
5265
        Py_DECREF(args);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5266
    }
5267
    Py_DECREF(cls);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5268
5269
    if (obj == NULL)
5270
        return -1;
5271
5272
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_inst with cost=150 (threshold=250) 
load_inst
inline
    
Pdata_push inlined into load_inst 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_inst
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5273
    return 0;
5274
}
5275
5276
static int
5277
load_newobj(UnpicklerObject *self)
5278
{
5279
    PyObject *args = NULL;
5280
    PyObject *clsraw = NULL;
5281
    PyTypeObject *cls;          /* clsraw cast to its true type */
5282
    PyObject *obj;
5283
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into load_newobj with cost=40 (threshold=375) 
load_newobj
inline
                      
_Pickle_GetGlobalState inlined into load_newobj 
load_newobj
5284
5285
    /* Stack is ... cls argtuple, and we want to call
5286
     * cls.__new__(cls, *argtuple).
5287
     */
5288
    PDATA_POP(self->stack, args);
inline
    
Pdata_pop can be inlined into load_newobj with cost=140 (threshold=250) 
load_newobj
inline
    
Pdata_pop inlined into load_newobj 
load_newobj
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_newobj
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5289
    if (args == NULL)
5290
        goto error;
5291
    if (!PyTuple_Check(args)) {
5292
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_newobj because its definition is unavailable 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5293
                        "NEWOBJ expected an arg " "tuple.");
5294
        goto error;
5295
    }
5296
5297
    PDATA_POP(self->stack, clsraw);
inline
    
Pdata_pop can be inlined into load_newobj with cost=140 (threshold=250) 
load_newobj
inline
    
Pdata_pop inlined into load_newobj 
load_newobj
gvn
    
load of type %struct.Pdata* eliminated in favor of load 
load_newobj
5298
    cls = (PyTypeObject *)clsraw;
5299
    if (cls == NULL)
5300
        goto error;
5301
    if (!PyType_Check(cls)) {
5302
        PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
inline
        
PyErr_SetString will not be inlined into load_newobj because its definition is unavailable 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5303
                        "isn't a type object");
5304
        goto error;
5305
    }
5306
    if (cls->tp_new == NULL) {
5307
        PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
inline
        
PyErr_SetString will not be inlined into load_newobj because its definition is unavailable 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5308
                        "has NULL tp_new");
5309
        goto error;
5310
    }
5311
5312
    /* Call __new__. */
5313
    obj = cls->tp_new(cls, args, NULL);
5314
    if (obj == NULL)
5315
        goto error;
5316
5317
    Py_DECREF(args);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5318
    Py_DECREF(clsraw);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5319
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_newobj with cost=150 (threshold=250) 
load_newobj
inline
    
Pdata_push inlined into load_newobj 
load_newobj
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5320
    return 0;
5321
5322
  error:
5323
    Py_XDECREF(args);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5324
    Py_XDECREF(clsraw);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5325
    return -1;
5326
}
5327
5328
static int
5329
load_newobj_ex(UnpicklerObject *self)
5330
{
5331
    PyObject *cls, *args, *kwargs;
5332
    PyObject *obj;
5333
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into load_newobj_ex with cost=40 (threshold=375) 
load_newobj_ex
inline
                      
_Pickle_GetGlobalState inlined into load_newobj_ex 
load_newobj_ex
5334
5335
    PDATA_POP(self->stack, kwargs);
inline
    
Pdata_pop can be inlined into load_newobj_ex with cost=140 (threshold=250) 
load_newobj_ex
inline
    
Pdata_pop inlined into load_newobj_ex 
load_newobj_ex
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_newobj_ex
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5336
    if (kwargs == NULL) {
5337
        return -1;
5338
    }
5339
    PDATA_POP(self->stack, args);
inline
    
Pdata_pop can be inlined into load_newobj_ex with cost=140 (threshold=250) 
load_newobj_ex
inline
    
Pdata_pop inlined into load_newobj_ex 
load_newobj_ex
gvn
    
load of type %struct.Pdata* eliminated in favor of load 
load_newobj_ex
5340
    if (args == NULL) {
5341
        Py_DECREF(kwargs);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5342
        return -1;
5343
    }
5344
    PDATA_POP(self->stack, cls);
inline
    
Pdata_pop can be inlined into load_newobj_ex with cost=140 (threshold=250) 
load_newobj_ex
inline
    
Pdata_pop inlined into load_newobj_ex 
load_newobj_ex
gvn
    
load of type %struct.Pdata* eliminated in favor of load 
load_newobj_ex
5345
    if (cls == NULL) {
5346
        Py_DECREF(kwargs);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5347
        Py_DECREF(args);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5348
        return -1;
5349
    }
5350
5351
    if (!PyType_Check(cls)) {
5352
        Py_DECREF(kwargs);
5353
        Py_DECREF(args);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5354
        PyErr_Format(st->UnpicklingError,
inline
        
PyErr_Format will not be inlined into load_newobj_ex because its definition is unavailable 
load_newobj_ex
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load
5355
                     "NEWOBJ_EX class argument must be a type, not %.200s",
5356
                     Py_TYPE(cls)->tp_name);
gvn
                     
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
                     
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
                     
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5357
        Py_DECREF(cls);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5358
        return -1;
5359
    }
5360
5361
    if (((PyTypeObject *)cls)->tp_new == NULL) {
5362
        Py_DECREF(kwargs);
5363
        Py_DECREF(args);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5364
        Py_DECREF(cls);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5365
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_newobj_ex because its definition is unavailable 
load_newobj_ex
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5366
                        "NEWOBJ_EX class argument doesn't have __new__");
5367
        return -1;
5368
    }
5369
    obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5370
    Py_DECREF(kwargs);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5371
    Py_DECREF(args);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5372
    Py_DECREF(cls);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_newobj_ex
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5373
    if (obj == NULL) {
5374
        return -1;
5375
    }
5376
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_newobj_ex with cost=150 (threshold=250) 
load_newobj_ex
inline
    
Pdata_push inlined into load_newobj_ex 
load_newobj_ex
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_newobj_ex
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5377
    return 0;
5378
}
5379
5380
static int
5381
load_global(UnpicklerObject *self)
5382
{
5383
    PyObject *global = NULL;
5384
    PyObject *module_name;
5385
    PyObject *global_name;
5386
    Py_ssize_t len;
5387
    char *s;
licm
    
hosting bitcast 
load
5388
5389
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_global
inline
               
_Unpickler_Readline will not be inlined into load_global 
load_global
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5390
        return -1;
5391
    if (len < 2)
5392
        return bad_readline();
inline
               
bad_readline can be inlined into load_global with cost=85 (threshold=375) 
load_global
inline
               
bad_readline inlined into load_global 
load_global
5393
    module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
inline
                  
PyUnicode_DecodeUTF8 will not be inlined into load_global because its definition is unavailable 
load_global
gvn
                                       
load of type i8* not eliminated because it is clobbered by call 
load_global
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                       
load of type i8* not eliminated because it is clobbered by call 
load
5394
    if (!module_name)
5395
        return -1;
5396
5397
    if ((len = _Unpickler_Readline(self, &s)) >= 0) {
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_global
inline
               
_Unpickler_Readline will not be inlined into load_global 
load_global
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5398
        if (len < 2) {
5399
            Py_DECREF(module_name);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5400
            return bad_readline();
inline
                   
bad_readline can be inlined into load_global with cost=85 (threshold=375) 
load_global
inline
                   
bad_readline inlined into load_global 
load_global
5401
        }
5402
        global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
inline
                      
PyUnicode_DecodeUTF8 will not be inlined into load_global because its definition is unavailable 
load_global
gvn
                                           
load of type i8* not eliminated in favor of load because it is clobbered by call 
load_global
licm
                                           
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                           
load of type i8* not eliminated in favor of load because it is clobbered by call 
load
5403
        if (global_name) {
5404
            global = find_class(self, module_name, global_name);
inline
                     
find_class can be inlined into load_global with cost=10 (threshold=375) 
load_global
inline
                     
find_class inlined into load_global 
load_global
5405
            Py_DECREF(global_name);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_global
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5406
        }
5407
    }
5408
    Py_DECREF(module_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_global
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5409
5410
    if (global == NULL)
5411
        return -1;
5412
    PDATA_PUSH(self->stack, global, -1);
inline
    
Pdata_push can be inlined into load_global with cost=150 (threshold=250) 
load_global
inline
    
Pdata_push inlined into load_global 
load_global
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_global
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_global
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5413
    return 0;
5414
}
5415
5416
static int
5417
load_stack_global(UnpicklerObject *self)
5418
{
5419
    PyObject *global;
5420
    PyObject *module_name;
5421
    PyObject *global_name;
5422
5423
    PDATA_POP(self->stack, global_name);
inline
    
Pdata_pop can be inlined into load_stack_global with cost=140 (threshold=250) 
load_stack_global
inline
    
Pdata_pop inlined into load_stack_global 
load_stack_global
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5424
    PDATA_POP(self->stack, module_name);
inline
    
Pdata_pop can be inlined into load_stack_global with cost=140 (threshold=250) 
load_stack_global
inline
    
Pdata_pop inlined into load_stack_global 
load_stack_global
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load eliminated by PRE 
load_stack_global
5425
    if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5426
        global_name == NULL || !PyUnicode_CheckExact(global_name)) {
gvn
                                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_stack_global
gvn
                                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5427
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_stack_global with cost=40 (threshold=375) 
load_stack_global
inline
                          
_Pickle_GetGlobalState inlined into load_stack_global 
load_stack_global
5428
        PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
inline
        
PyErr_SetString will not be inlined into load_stack_global because its definition is unavailable 
load_stack_global
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_stack_global
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5429
        Py_XDECREF(global_name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5430
        Py_XDECREF(module_name);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_stack_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_stack_global
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5431
        return -1;
5432
    }
5433
    global = find_class(self, module_name, global_name);
inline
             
find_class can be inlined into load_stack_global with cost=10 (threshold=375) 
load_stack_global
inline
             
find_class inlined into load_stack_global 
load_stack_global
5434
    Py_DECREF(global_name);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_stack_global
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5435
    Py_DECREF(module_name);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_stack_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_stack_global
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated in favor of load because it is clobbered by call 
load
5436
    if (global == NULL)
5437
        return -1;
5438
    PDATA_PUSH(self->stack, global, -1);
inline
    
Pdata_push can be inlined into load_stack_global with cost=150 (threshold=250) 
load_stack_global
inline
    
Pdata_push inlined into load_stack_global 
load_stack_global
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_stack_global
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_stack_global
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5439
    return 0;
5440
}
5441
5442
static int
5443
load_persid(UnpicklerObject *self)
5444
{
5445
    PyObject *pid;
5446
    Py_ssize_t len;
5447
    char *s;
licm
    
hosting bitcast 
load
5448
5449
    if (self->pers_func) {
licm
              
hosting getelementptr 
load
licm
              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
5450
        if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
                   
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_persid
inline
                   
_Unpickler_Readline will not be inlined into load_persid 
load_persid
inline
                   
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
                   
_Unpickler_Readline will not be inlined into load 
load
5451
            return -1;
5452
        if (len < 1)
5453
            return bad_readline();
inline
                   
bad_readline can be inlined into load_persid with cost=85 (threshold=375) 
load_persid
inline
                   
bad_readline inlined into load_persid 
load_persid
5454
5455
        pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
inline
              
PyUnicode_DecodeASCII will not be inlined into load_persid because its definition is unavailable 
load_persid
gvn
                                    
load of type i8* not eliminated because it is clobbered by call 
load_persid
licm
                                    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                    
load of type i8* not eliminated because it is clobbered by call 
load
5456
        if (pid == NULL) {
5457
            if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
inline
                
PyErr_ExceptionMatches will not be inlined into load_persid because its definition is unavailable 
load_persid
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
load_persid
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
load
5458
                PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
inline
                
PyErr_SetString will not be inlined into load_persid because its definition is unavailable 
load_persid
inline
                                
_Pickle_GetGlobalState can be inlined into load_persid with cost=40 (threshold=375) 
load_persid
inline
                                
_Pickle_GetGlobalState inlined into load_persid 
load_persid
gvn
                                                          
load of type %struct._object* not eliminated because it is clobbered by call 
load_persid
gvn
                                                          
load of type %struct._object* not eliminated because it is clobbered by call 
load
5459
                                "persistent IDs in protocol 0 must be "
5460
                                "ASCII strings");
5461
            }
5462
            return -1;
5463
        }
5464
5465
        /* This does not leak since _Pickle_FastCall() steals the reference
5466
           to pid first. */
5467
        pid = _Pickle_FastCall(self->pers_func, pid);
inline
              
_Pickle_FastCall can be inlined into load_persid with cost=70 (threshold=250) 
load_persid
inline
              
_Pickle_FastCall inlined into load_persid 
load_persid
gvn
                                     
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load_persid
licm
                                     
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                     
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load
5468
        if (pid == NULL)
5469
            return -1;
5470
5471
        PDATA_PUSH(self->stack, pid, -1);
inline
        
Pdata_push can be inlined into load_persid with cost=150 (threshold=250) 
load_persid
inline
        
Pdata_push inlined into load_persid 
load_persid
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_persid
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_persid
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5472
        return 0;
5473
    }
5474
    else {
5475
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_persid with cost=40 (threshold=375) 
load_persid
inline
                          
_Pickle_GetGlobalState inlined into load_persid 
load_persid
5476
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_persid because its definition is unavailable 
load_persid
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_persid
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5477
                        "A load persistent id instruction was encountered,\n"
5478
                        "but no persistent_load function was specified.");
5479
        return -1;
5480
    }
5481
}
5482
5483
static int
5484
load_binpersid(UnpicklerObject *self)
5485
{
5486
    PyObject *pid;
5487
5488
    if (self->pers_func) {
licm
              
hosting getelementptr 
load
licm
              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
load
5489
        PDATA_POP(self->stack, pid);
inline
        
Pdata_pop can be inlined into load_binpersid with cost=140 (threshold=250) 
load_binpersid
inline
        
Pdata_pop inlined into load_binpersid 
load_binpersid
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5490
        if (pid == NULL)
5491
            return -1;
5492
5493
        /* This does not leak since _Pickle_FastCall() steals the
5494
           reference to pid first. */
5495
        pid = _Pickle_FastCall(self->pers_func, pid);
inline
              
_Pickle_FastCall can be inlined into load_binpersid with cost=-14930 (threshold=250) 
load_binpersid
inline
              
_Pickle_FastCall inlined into load_binpersid 
load_binpersid
gvn
                                     
load of type %struct._object* eliminated in favor of load 
load_binpersid
5496
        if (pid == NULL)
5497
            return -1;
5498
5499
        PDATA_PUSH(self->stack, pid, -1);
inline
        
Pdata_push can be inlined into load_binpersid with cost=150 (threshold=250) 
load_binpersid
inline
        
Pdata_push inlined into load_binpersid 
load_binpersid
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_binpersid
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_binpersid
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5500
        return 0;
5501
    }
5502
    else {
5503
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into load_binpersid with cost=40 (threshold=375) 
load_binpersid
inline
                          
_Pickle_GetGlobalState inlined into load_binpersid 
load_binpersid
5504
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into load_binpersid because its definition is unavailable 
load_binpersid
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binpersid
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5505
                        "A load persistent id instruction was encountered,\n"
5506
                        "but no persistent_load function was specified.");
5507
        return -1;
5508
    }
5509
}
5510
5511
static int
5512
load_pop(UnpicklerObject *self)
5513
{
5514
    Py_ssize_t len = Py_SIZE(self->stack);
licm
                     
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5515
5516
    /* Note that we split the (pickle.py) stack into two stacks,
5517
     * an object stack and a mark stack. We have to be clever and
5518
     * pop the right one. We do this by looking at the top of the
5519
     * mark stack first, and only signalling a stack underflow if
5520
     * the object stack is empty and the mark stack doesn't match
5521
     * our expectations.
5522
     */
5523
    if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
licm
              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
                                     
hosting getelementptr 
load
licm
                                     
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                                     
load of type i64* not eliminated because it is clobbered by call 
load
5524
        self->num_marks--;
5525
        self->stack->mark_set = self->num_marks != 0;
5526
        self->stack->fence = self->num_marks ?
gvn
                                   
load of type i64 eliminated in favor of add 
load_pop
5527
                self->marks[self->num_marks - 1] : 0;
gvn
                
load of type i64 not eliminated because it is clobbered by store 
load
5528
    } else if (len <= self->stack->fence)
5529
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_pop with cost=95 (threshold=375) 
load_pop
inline
               
Pdata_stack_underflow inlined into load_pop 
load_pop
5530
    else {
5531
        len--;
5532
        Py_DECREF(self->stack->data[len]);
5533
        Py_SIZE(self->stack) = len;
gvn
        
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load_pop
gvn
        
load eliminated by PRE 
load_pop
5534
    }
5535
    return 0;
5536
}
5537
5538
static int
5539
load_pop_mark(UnpicklerObject *self)
5540
{
5541
    Py_ssize_t i;
5542
5543
    if ((i = marker(self)) < 0)
inline
             
marker can be inlined into load_pop_mark with cost=165 (threshold=250) 
load_pop_mark
inline
             
marker inlined into load_pop_mark 
load_pop_mark
5544
        return -1;
5545
5546
    Pdata_clear(self->stack, i);
inline
    
Pdata_clear can be inlined into load_pop_mark with cost=85 (threshold=250) 
load_pop_mark
inline
    
Pdata_clear inlined into load_pop_mark 
load_pop_mark
gvn
                      
load of type %struct.Pdata* eliminated in favor of load 
load_pop_mark
5547
5548
    return 0;
5549
}
5550
5551
static int
5552
load_dup(UnpicklerObject *self)
5553
{
5554
    PyObject *last;
5555
    Py_ssize_t len = Py_SIZE(self->stack);
5556
5557
    if (len <= self->stack->fence)
5558
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_dup with cost=95 (threshold=375) 
load_dup
inline
               
Pdata_stack_underflow inlined into load_dup 
load_dup
5559
    last = self->stack->data[len - 1];
5560
    PDATA_APPEND(self->stack, last, -1);
inline
    
Pdata_push can be inlined into load_dup with cost=150 (threshold=250) 
load_dup
inline
    
Pdata_push inlined into load_dup 
load_dup
5561
    return 0;
5562
}
5563
5564
static int
5565
load_get(UnpicklerObject *self)
5566
{
5567
    PyObject *key, *value;
5568
    Py_ssize_t idx;
5569
    Py_ssize_t len;
5570
    char *s;
licm
    
hosting bitcast 
load
5571
5572
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_get
inline
               
_Unpickler_Readline will not be inlined into load_get 
load_get
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5573
        return -1;
5574
    if (len < 2)
5575
        return bad_readline();
inline
               
bad_readline can be inlined into load_get with cost=85 (threshold=375) 
load_get
inline
               
bad_readline inlined into load_get 
load_get
5576
5577
    key = PyLong_FromString(s, NULL, 10);
inline
          
PyLong_FromString will not be inlined into load_get because its definition is unavailable 
load_get
gvn
                            
load of type i8* not eliminated because it is clobbered by call 
load_get
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                            
load of type i8* not eliminated because it is clobbered by call 
load
5578
    if (key == NULL)
5579
        return -1;
5580
    idx = PyLong_AsSsize_t(key);
inline
          
PyLong_AsSsize_t will not be inlined into load_get because its definition is unavailable 
load_get
5581
    if (idx == -1 && PyErr_Occurred()) {
inline
                     
PyErr_Occurred will not be inlined into load_get because its definition is unavailable 
load_get
5582
        Py_DECREF(key);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_get
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_get
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5583
        return -1;
5584
    }
5585
5586
    value = _Unpickler_MemoGet(self, idx);
inline
            
_Unpickler_MemoGet can be inlined into load_get with cost=-15000 (threshold=250) 
load_get
inline
            
_Unpickler_MemoGet inlined into load_get 
load_get
5587
    if (value == NULL) {
5588
        if (!PyErr_Occurred())
inline
             
PyErr_Occurred will not be inlined into load_get because its definition is unavailable 
load_get
5589
            PyErr_SetObject(PyExc_KeyError, key);
inline
            
PyErr_SetObject will not be inlined into load_get because its definition is unavailable 
load_get
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_get
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5590
        Py_DECREF(key);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_get
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_get
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_get
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_get
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5591
        return -1;
5592
    }
5593
    Py_DECREF(key);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_get
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_get
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5594
5595
    PDATA_APPEND(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_get with cost=150 (threshold=250) 
load_get
inline
    
Pdata_push inlined into load_get 
load_get
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_get
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_get
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_get
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_get
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5596
    return 0;
5597
}
5598
5599
static int
5600
load_binget(UnpicklerObject *self)
5601
{
5602
    PyObject *value;
5603
    Py_ssize_t idx;
5604
    char *s;
5605
5606
    if (_Unpickler_Read(self, &s, 1) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binget with cost=230 (threshold=250) 
load_binget
inline
        
_Unpickler_ReadImpl inlined into load_binget 
load_binget
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
5607
        return -1;
5608
5609
    idx = Py_CHARMASK(s[0]);
gvn
          
load of type i8 not eliminated because it is clobbered by store 
load_binget
gvn
          
load of type i8 not eliminated because it is clobbered by store 
load
5610
5611
    value = _Unpickler_MemoGet(self, idx);
inline
            
_Unpickler_MemoGet can be inlined into load_binget with cost=0 (threshold=250) 
load_binget
inline
            
_Unpickler_MemoGet inlined into load_binget 
load_binget
5612
    if (value == NULL) {
5613
        PyObject *key = PyLong_FromSsize_t(idx);
inline
                        
PyLong_FromSsize_t will not be inlined into load_binget because its definition is unavailable 
load_binget
5614
        if (key != NULL) {
5615
            PyErr_SetObject(PyExc_KeyError, key);
inline
            
PyErr_SetObject will not be inlined into load_binget because its definition is unavailable 
load_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5616
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_binget
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_binget
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5617
        }
5618
        return -1;
5619
    }
5620
5621
    PDATA_APPEND(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_binget with cost=150 (threshold=250) 
load_binget
inline
    
Pdata_push inlined into load_binget 
load_binget
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binget
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5622
    return 0;
5623
}
5624
5625
static int
5626
load_long_binget(UnpicklerObject *self)
5627
{
5628
    PyObject *value;
5629
    Py_ssize_t idx;
5630
    char *s;
5631
5632
    if (_Unpickler_Read(self, &s, 4) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_long_binget with cost=230 (threshold=250) 
load_long_binget
inline
        
_Unpickler_ReadImpl inlined into load_long_binget 
load_long_binget
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
5633
        return -1;
5634
5635
    idx = calc_binsize(s, 4);
inline
          
calc_binsize can be inlined into load_long_binget with cost=20 (threshold=250) 
load_long_binget
inline
          
calc_binsize inlined into load_long_binget 
load_long_binget
5636
5637
    value = _Unpickler_MemoGet(self, idx);
inline
            
_Unpickler_MemoGet can be inlined into load_long_binget with cost=0 (threshold=250) 
load_long_binget
inline
            
_Unpickler_MemoGet inlined into load_long_binget 
load_long_binget
5638
    if (value == NULL) {
5639
        PyObject *key = PyLong_FromSsize_t(idx);
inline
                        
PyLong_FromSsize_t will not be inlined into load_long_binget because its definition is unavailable 
load_long_binget
5640
        if (key != NULL) {
5641
            PyErr_SetObject(PyExc_KeyError, key);
inline
            
PyErr_SetObject will not be inlined into load_long_binget because its definition is unavailable 
load_long_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_long_binget
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5642
            Py_DECREF(key);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_long_binget
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_long_binget
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5643
        }
5644
        return -1;
5645
    }
5646
5647
    PDATA_APPEND(self->stack, value, -1);
inline
    
Pdata_push can be inlined into load_long_binget with cost=150 (threshold=250) 
load_long_binget
inline
    
Pdata_push inlined into load_long_binget 
load_long_binget
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_long_binget
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5648
    return 0;
5649
}
5650
5651
/* Push an object from the extension registry (EXT[124]).  nbytes is
5652
 * the number of bytes following the opcode, holding the index (code) value.
5653
 */
5654
static int
5655
load_extension(UnpicklerObject *self, int nbytes)
5656
{
5657
    char *codebytes;            /* the nbytes bytes after the opcode */
5658
    long code;                  /* calc_binint returns long */
5659
    PyObject *py_code;          /* code as a Python int */
5660
    PyObject *obj;              /* the object to push */
5661
    PyObject *pair;             /* (module_name, class_name) */
5662
    PyObject *module_name, *class_name;
5663
    PickleState *st = _Pickle_GetGlobalState();
inline
                      
_Pickle_GetGlobalState can be inlined into load_extension with cost=40 (threshold=375) 
load_extension
inline
                      
_Pickle_GetGlobalState inlined into load_extension 
load_extension
5664
5665
    assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5666
    if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_extension with cost=235 (threshold=250) 
load_extension
inline
        
_Unpickler_ReadImpl inlined into load_extension 
load_extension
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type i8* not eliminated because it is clobbered by call 
load_extension
5667
        return -1;
5668
    code = calc_binint(codebytes, nbytes);
inline
           
calc_binint can be inlined into load_extension with cost=-14955 (threshold=250) 
load_extension
inline
           
calc_binint inlined into load_extension 
load_extension
5669
    if (code <= 0) {            /* note that 0 is forbidden */
5670
        /* Corrupt or hostile pickle. */
5671
        PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
inline
        
PyErr_SetString will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5672
        return -1;
5673
    }
5674
5675
    /* Look for the code in the cache. */
5676
    py_code = PyLong_FromLong(code);
inline
              
PyLong_FromLong will not be inlined into load_extension because its definition is unavailable 
load_extension
5677
    if (py_code == NULL)
5678
        return -1;
5679
    obj = PyDict_GetItemWithError(st->extension_cache, py_code);
inline
          
PyDict_GetItemWithError will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                                      
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5680
    if (obj != NULL) {
5681
        /* Bingo. */
5682
        Py_DECREF(py_code);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5683
        PDATA_APPEND(self->stack, obj, -1);
inline
        
Pdata_push can be inlined into load_extension with cost=150 (threshold=250) 
load_extension
inline
        
Pdata_push inlined into load_extension 
load_extension
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_extension
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_extension
5684
        return 0;
5685
    }
5686
    if (PyErr_Occurred()) {
inline
        
PyErr_Occurred will not be inlined into load_extension because its definition is unavailable 
load_extension
5687
        Py_DECREF(py_code);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5688
        return -1;
5689
    }
5690
5691
    /* Look up the (module_name, class_name) pair. */
5692
    pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
inline
           
PyDict_GetItemWithError will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5693
    if (pair == NULL) {
5694
        Py_DECREF(py_code);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5695
        if (!PyErr_Occurred()) {
inline
             
PyErr_Occurred will not be inlined into load_extension because its definition is unavailable 
load_extension
5696
            PyErr_Format(PyExc_ValueError, "unregistered extension "
inline
            
PyErr_Format will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5697
                         "code %ld", code);
5698
        }
5699
        return -1;
5700
    }
5701
    /* Since the extension registry is manipulable via Python code,
5702
     * confirm that pair is really a 2-tuple of strings.
5703
     */
5704
    if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
inline
                                
PyTuple_Size will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
         
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5705
        !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
gvn
         
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5706
        !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
gvn
         
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5707
        Py_DECREF(py_code);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5708
        PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
inline
        
PyErr_Format will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_extension
5709
                     "isn't a 2-tuple of strings", code);
5710
        return -1;
5711
    }
5712
    /* Load the object. */
5713
    obj = find_class(self, module_name, class_name);
inline
          
find_class can be inlined into load_extension with cost=-14990 (threshold=375) 
load_extension
inline
          
find_class inlined into load_extension 
load_extension
5714
    if (obj == NULL) {
5715
        Py_DECREF(py_code);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5716
        return -1;
5717
    }
5718
    /* Cache code -> obj. */
5719
    code = PyDict_SetItem(st->extension_cache, py_code, obj);
inline
           
PyDict_SetItem will not be inlined into load_extension because its definition is unavailable 
load_extension
gvn
                              
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load_extension
5720
    Py_DECREF(py_code);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5721
    if (code < 0) {
5722
        Py_DECREF(obj);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_extension
5723
        return -1;
5724
    }
5725
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_extension with cost=150 (threshold=250) 
load_extension
inline
    
Pdata_push inlined into load_extension 
load_extension
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_extension
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_extension
5726
    return 0;
5727
}
5728
5729
static int
5730
load_put(UnpicklerObject *self)
5731
{
5732
    PyObject *key, *value;
5733
    Py_ssize_t idx;
5734
    Py_ssize_t len;
5735
    char *s;
licm
    
hosting bitcast 
load
5736
5737
    if ((len = _Unpickler_Readline(self, &s)) < 0)
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load_put
inline
               
_Unpickler_Readline will not be inlined into load_put 
load_put
inline
               
_Unpickler_Readline too costly to inline (cost=590, threshold=250) 
load
inline
               
_Unpickler_Readline will not be inlined into load 
load
5738
        return -1;
5739
    if (len < 2)
5740
        return bad_readline();
inline
               
bad_readline can be inlined into load_put with cost=85 (threshold=375) 
load_put
inline
               
bad_readline inlined into load_put 
load_put
5741
    if (Py_SIZE(self->stack) <= self->stack->fence)
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_put
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5742
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_put with cost=95 (threshold=375) 
load_put
inline
               
Pdata_stack_underflow inlined into load_put 
load_put
5743
    value = self->stack->data[Py_SIZE(self->stack) - 1];
5744
5745
    key = PyLong_FromString(s, NULL, 10);
inline
          
PyLong_FromString will not be inlined into load_put because its definition is unavailable 
load_put
gvn
                            
load of type i8* not eliminated because it is clobbered by call 
load_put
licm
                            
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                            
load of type i8* not eliminated because it is clobbered by call 
load
5746
    if (key == NULL)
5747
        return -1;
5748
    idx = PyLong_AsSsize_t(key);
inline
          
PyLong_AsSsize_t will not be inlined into load_put because its definition is unavailable 
load_put
5749
    Py_DECREF(key);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_put
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_put
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5750
    if (idx < 0) {
5751
        if (!PyErr_Occurred())
inline
             
PyErr_Occurred will not be inlined into load_put because its definition is unavailable 
load_put
5752
            PyErr_SetString(PyExc_ValueError,
inline
            
PyErr_SetString will not be inlined into load_put because its definition is unavailable 
load_put
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load_put
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
load
5753
                            "negative PUT argument");
5754
        return -1;
5755
    }
5756
5757
    return _Unpickler_MemoPut(self, idx, value);
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load_put
inline
           
_Unpickler_MemoPut will not be inlined into load_put 
load_put
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load
inline
           
_Unpickler_MemoPut will not be inlined into load 
load
5758
}
5759
5760
static int
5761
load_binput(UnpicklerObject *self)
5762
{
5763
    PyObject *value;
5764
    Py_ssize_t idx;
5765
    char *s;
5766
5767
    if (_Unpickler_Read(self, &s, 1) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_binput with cost=230 (threshold=250) 
load_binput
inline
        
_Unpickler_ReadImpl inlined into load_binput 
load_binput
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
5768
        return -1;
5769
5770
    if (Py_SIZE(self->stack) <= self->stack->fence)
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_binput
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5771
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_binput with cost=95 (threshold=375) 
load_binput
inline
               
Pdata_stack_underflow inlined into load_binput 
load_binput
5772
    value = self->stack->data[Py_SIZE(self->stack) - 1];
5773
5774
    idx = Py_CHARMASK(s[0]);
gvn
          
load of type i8 not eliminated because it is clobbered by store 
load_binput
gvn
          
load of type i8 not eliminated because it is clobbered by store 
load
5775
5776
    return _Unpickler_MemoPut(self, idx, value);
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load_binput
inline
           
_Unpickler_MemoPut will not be inlined into load_binput 
load_binput
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load
inline
           
_Unpickler_MemoPut will not be inlined into load 
load
5777
}
5778
5779
static int
5780
load_long_binput(UnpicklerObject *self)
5781
{
5782
    PyObject *value;
5783
    Py_ssize_t idx;
5784
    char *s;
5785
5786
    if (_Unpickler_Read(self, &s, 4) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_long_binput with cost=230 (threshold=250) 
load_long_binput
inline
        
_Unpickler_ReadImpl inlined into load_long_binput 
load_long_binput
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
5787
        return -1;
5788
5789
    if (Py_SIZE(self->stack) <= self->stack->fence)
gvn
        
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_long_binput
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5790
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_long_binput with cost=95 (threshold=375) 
load_long_binput
inline
               
Pdata_stack_underflow inlined into load_long_binput 
load_long_binput
5791
    value = self->stack->data[Py_SIZE(self->stack) - 1];
5792
5793
    idx = calc_binsize(s, 4);
inline
          
calc_binsize can be inlined into load_long_binput with cost=20 (threshold=250) 
load_long_binput
inline
          
calc_binsize inlined into load_long_binput 
load_long_binput
5794
    if (idx < 0) {
5795
        PyErr_SetString(PyExc_ValueError,
inline
        
PyErr_SetString will not be inlined into load_long_binput because its definition is unavailable 
load_long_binput
5796
                        "negative LONG_BINPUT argument");
5797
        return -1;
5798
    }
5799
5800
    return _Unpickler_MemoPut(self, idx, value);
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load_long_binput
inline
           
_Unpickler_MemoPut will not be inlined into load_long_binput 
load_long_binput
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load
inline
           
_Unpickler_MemoPut will not be inlined into load 
load
5801
}
5802
5803
static int
5804
load_memoize(UnpicklerObject *self)
5805
{
5806
    PyObject *value;
5807
5808
    if (Py_SIZE(self->stack) <= self->stack->fence)
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5809
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_memoize with cost=95 (threshold=375) 
load_memoize
inline
               
Pdata_stack_underflow inlined into load_memoize 
load_memoize
5810
    value = self->stack->data[Py_SIZE(self->stack) - 1];
5811
5812
    return _Unpickler_MemoPut(self, self->memo_len, value);
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load_memoize
inline
           
_Unpickler_MemoPut will not be inlined into load_memoize 
load_memoize
inline
           
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
load
inline
           
_Unpickler_MemoPut will not be inlined into load 
load
licm
                                          
hosting getelementptr 
load
licm
                                          
failed to move load with loop-invariant address because the loop may invalidate its value 
load
5813
}
5814
5815
static int
5816
do_append(UnpicklerObject *self, Py_ssize_t x)
5817
{
5818
    PyObject *value;
5819
    PyObject *list;
5820
    Py_ssize_t len, i;
5821
5822
    len = Py_SIZE(self->stack);
5823
    if (x > len || x <= self->stack->fence)
5824
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into do_append with cost=95 (threshold=375) 
do_append
inline
               
Pdata_stack_underflow inlined into do_append 
do_append
5825
    if (len == x)  /* nothing to do */
5826
        return 0;
5827
5828
    list = self->stack->data[x - 1];
5829
5830
    if (PyList_Check(list)) {
5831
        PyObject *slice;
5832
        Py_ssize_t list_len;
5833
        int ret;
5834
5835
        slice = Pdata_poplist(self->stack, x);
inline
                
Pdata_poplist can be inlined into do_append with cost=-14920 (threshold=250) 
do_append
inline
                
Pdata_poplist inlined into do_append 
do_append
5836
        if (!slice)
5837
            return -1;
5838
        list_len = PyList_GET_SIZE(list);
gvn
                   
load of type i64 not eliminated because it is clobbered by store 
do_append
5839
        ret = PyList_SetSlice(list, list_len, list_len, slice);
inline
              
PyList_SetSlice will not be inlined into do_append because its definition is unavailable 
do_append
5840
        Py_DECREF(slice);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
5841
        return ret;
5842
    }
5843
    else {
5844
        PyObject *append_func;
5845
        _Py_IDENTIFIER(append);
5846
5847
        append_func = _PyObject_GetAttrId(list, &PyId_append);
inline
                      
_PyObject_GetAttrId will not be inlined into do_append because its definition is unavailable 
do_append
5848
        if (append_func == NULL)
5849
            return -1;
5850
        for (i = x; i < len; i++) {
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
do_append
loop-vectorize
        
loop not vectorized 
do_append
5851
            PyObject *result;
5852
5853
            value = self->stack->data[i];
licm
                          
failed to move load with loop-invariant address because the loop may invalidate its value 
do_append
gvn
                          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_append
gvn
                          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_append
gvn
                          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_append
gvn
                          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_append
5854
            result = _Pickle_FastCall(append_func, value);
inline
                     
_Pickle_FastCall can be inlined into do_append with cost=70 (threshold=250) 
do_append
inline
                     
_Pickle_FastCall inlined into do_append 
do_append
5855
            if (result == NULL) {
5856
                Pdata_clear(self->stack, i + 1);
inline
                
Pdata_clear can be inlined into do_append with cost=85 (threshold=250) 
do_append
inline
                
Pdata_clear inlined into do_append 
do_append
gvn
                                  
load of type %struct.Pdata* not eliminated because it is clobbered by call 
do_append
gvn
                                  
load of type %struct.Pdata* not eliminated because it is clobbered by call 
do_append
5857
                Py_SIZE(self->stack) = x;
gvn
                
load of type %struct.PyVarObject* not eliminated because it is clobbered by store 
do_append
gvn
                
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
do_append
gvn
                
load eliminated by PRE 
do_append
5858
                Py_DECREF(append_func);
gvn
                
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
                
load of type i64 not eliminated because it is clobbered by store 
do_append
gvn
                
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by store 
do_append
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
5859
                return -1;
5860
            }
5861
            Py_DECREF(result);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
5862
        }
5863
        Py_SIZE(self->stack) = x;
gvn
        
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
do_append
5864
        Py_DECREF(append_func);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
        
load of type i64 not eliminated because it is clobbered by store 
do_append
gvn
        
load of type i64 not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
do_append
5865
    }
5866
5867
    return 0;
5868
}
5869
5870
static int
5871
load_append(UnpicklerObject *self)
5872
{
5873
    if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5874
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_append with cost=95 (threshold=375) 
load_append
inline
               
Pdata_stack_underflow inlined into load_append 
load_append
5875
    return do_append(self, Py_SIZE(self->stack) - 1);
inline
           
do_append too costly to inline (cost=630, threshold=625) 
load_append
inline
           
do_append will not be inlined into load_append 
load_append
inline
           
do_append too costly to inline (cost=630, threshold=625) 
load
inline
           
do_append will not be inlined into load 
load
5876
}
5877
5878
static int
5879
load_appends(UnpicklerObject *self)
5880
{
5881
    Py_ssize_t i = marker(self);
inline
                   
marker can be inlined into load_appends with cost=165 (threshold=250) 
load_appends
inline
                   
marker inlined into load_appends 
load_appends
5882
    if (i < 0)
5883
        return -1;
5884
    return do_append(self, i);
inline
           
do_append too costly to inline (cost=630, threshold=625) 
load_appends
inline
           
do_append will not be inlined into load_appends 
load_appends
inline
           
do_append too costly to inline (cost=630, threshold=625) 
load
inline
           
do_append will not be inlined into load 
load
5885
}
5886
5887
static int
5888
do_setitems(UnpicklerObject *self, Py_ssize_t x)
5889
{
5890
    PyObject *value, *key;
5891
    PyObject *dict;
5892
    Py_ssize_t len, i;
5893
    int status = 0;
5894
5895
    len = Py_SIZE(self->stack);
5896
    if (x > len || x <= self->stack->fence)
5897
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into do_setitems with cost=-14905 (threshold=375) 
do_setitems
inline
               
Pdata_stack_underflow inlined into do_setitems 
do_setitems
5898
    if (len == x)  /* nothing to do */
5899
        return 0;
5900
    if ((len - x) % 2 != 0) {
5901
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into do_setitems with cost=40 (threshold=375) 
do_setitems
inline
                          
_Pickle_GetGlobalState inlined into do_setitems 
do_setitems
5902
        /* Currupt or hostile pickle -- we never write one like this. */
5903
        PyErr_SetString(st->UnpicklingError,
inline
        
PyErr_SetString will not be inlined into do_setitems because its definition is unavailable 
do_setitems
gvn
                            
load of type %struct._object* not eliminated because it is clobbered by call 
do_setitems
5904
                        "odd number of items for SETITEMS");
5905
        return -1;
5906
    }
5907
5908
    /* Here, dict does not actually need to be a PyDict; it could be anything
5909
       that supports the __setitem__ attribute. */
5910
    dict = self->stack->data[x - 1];
5911
5912
    for (i = x + 1; i < len; i += 2) {
5913
        key = self->stack->data[i - 1];
licm
                    
failed to move load with loop-invariant address because the loop may invalidate its value 
do_setitems
gvn
                    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_setitems
gvn
                    
load eliminated by PRE 
do_setitems
gvn
                           
load eliminated by PRE 
do_setitems
5914
        value = self->stack->data[i];
5915
        if (PyObject_SetItem(dict, key, value) < 0) {
inline
            
PyObject_SetItem will not be inlined into do_setitems because its definition is unavailable 
do_setitems
loop-vectorize
            
loop not vectorized: loop control flow is not understood by vectorizer 
do_setitems
loop-vectorize
            
loop not vectorized 
do_setitems
5916
            status = -1;
5917
            break;
5918
        }
5919
    }
5920
5921
    Pdata_clear(self->stack, x);
inline
    
Pdata_clear can be inlined into do_setitems with cost=85 (threshold=250) 
do_setitems
inline
    
Pdata_clear inlined into do_setitems 
do_setitems
gvn
                      
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
do_setitems
gvn
                      
load eliminated by PRE 
do_setitems
5922
    return status;
5923
}
5924
5925
static int
5926
load_setitem(UnpicklerObject *self)
5927
{
5928
    return do_setitems(self, Py_SIZE(self->stack) - 2);
inline
           
do_setitems too costly to inline (cost=540, threshold=250) 
load_setitem
inline
           
do_setitems will not be inlined into load_setitem 
load_setitem
inline
           
do_setitems too costly to inline (cost=540, threshold=250) 
load
inline
           
do_setitems will not be inlined into load 
load
licm
                             
hosting bitcast 
load
licm
                             
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by store 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by store 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
gvn
                             
load of type %struct.PyVarObject* not eliminated because it is clobbered by call 
load
5929
}
5930
5931
static int
5932
load_setitems(UnpicklerObject *self)
5933
{
5934
    Py_ssize_t i = marker(self);
inline
                   
marker can be inlined into load_setitems with cost=-14835 (threshold=250) 
load_setitems
inline
                   
marker inlined into load_setitems 
load_setitems
5935
    if (i < 0)
5936
        return -1;
5937
    return do_setitems(self, i);
inline
           
do_setitems too costly to inline (cost=540, threshold=250) 
load_setitems
inline
           
do_setitems will not be inlined into load_setitems 
load_setitems
inline
           
do_setitems too costly to inline (cost=540, threshold=250) 
load
inline
           
do_setitems will not be inlined into load 
load
5938
}
5939
5940
static int
5941
load_additems(UnpicklerObject *self)
5942
{
5943
    PyObject *set;
5944
    Py_ssize_t mark, len, i;
5945
5946
    mark =  marker(self);
inline
            
marker can be inlined into load_additems with cost=165 (threshold=250) 
load_additems
inline
            
marker inlined into load_additems 
load_additems
5947
    if (mark < 0)
5948
        return -1;
5949
    len = Py_SIZE(self->stack);
gvn
          
load of type %struct.Pdata* eliminated in favor of load 
load_additems
5950
    if (mark > len || mark <= self->stack->fence)
gvn
                                           
load of type i64 eliminated in favor of phi 
load_additems
5951
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_additems with cost=95 (threshold=375) 
load_additems
inline
               
Pdata_stack_underflow inlined into load_additems 
load_additems
5952
    if (len == mark)  /* nothing to do */
5953
        return 0;
5954
5955
    set = self->stack->data[mark - 1];
5956
5957
    if (PySet_Check(set)) {
inline
        
PyType_IsSubtype will not be inlined into load_additems because its definition is unavailable 
load_additems
5958
        PyObject *items;
5959
        int status;
5960
5961
        items = Pdata_poptuple(self->stack, mark);
inline
                
Pdata_poptuple can be inlined into load_additems with cost=220 (threshold=250) 
load_additems
inline
                
Pdata_poptuple inlined into load_additems 
load_additems
gvn
                                     
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_additems
gvn
                                     
load eliminated by PRE 
load_additems
5962
        if (items == NULL)
5963
            return -1;
5964
5965
        status = _PySet_Update(set, items);
inline
                 
_PySet_Update will not be inlined into load_additems because its definition is unavailable 
load_additems
5966
        Py_DECREF(items);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_additems
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_additems
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5967
        return status;
5968
    }
5969
    else {
5970
        PyObject *add_func;
5971
        _Py_IDENTIFIER(add);
5972
5973
        add_func = _PyObject_GetAttrId(set, &PyId_add);
inline
                   
_PyObject_GetAttrId will not be inlined into load_additems because its definition is unavailable 
load_additems
5974
        if (add_func == NULL)
5975
            return -1;
5976
        for (i = mark; i < len; i++) {
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load
loop-vectorize
        
loop not vectorized 
load
5977
            PyObject *result;
5978
            PyObject *item;
5979
5980
            item = self->stack->data[i];
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
load_additems
gvn
                         
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_additems
gvn
                         
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_additems
gvn
                         
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_additems
gvn
                         
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_additems
licm
                         
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                         
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                         
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                         
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
                         
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
5981
            result = _Pickle_FastCall(add_func, item);
inline
                     
_Pickle_FastCall can be inlined into load_additems with cost=70 (threshold=250) 
load_additems
inline
                     
_Pickle_FastCall inlined into load_additems 
load_additems
5982
            if (result == NULL) {
5983
                Pdata_clear(self->stack, i + 1);
inline
                
Pdata_clear can be inlined into load_additems with cost=85 (threshold=250) 
load_additems
inline
                
Pdata_clear inlined into load_additems 
load_additems
gvn
                                  
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_additems
gvn
                                  
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_additems
licm
                                  
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                  
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
                                  
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
5984
                Py_SIZE(self->stack) = mark;
5985
                return -1;
5986
            }
5987
            Py_DECREF(result);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_additems
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_additems
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_additems
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
5988
        }
5989
        Py_SIZE(self->stack) = mark;
5990
    }
5991
5992
    return 0;
5993
}
5994
5995
static int
5996
load_build(UnpicklerObject *self)
5997
{
5998
    PyObject *state, *inst, *slotstate;
5999
    PyObject *setstate;
6000
    int status = 0;
6001
    _Py_IDENTIFIER(__setstate__);
6002
6003
    /* Stack is ... instance, state.  We want to leave instance at
6004
     * the stack top, possibly mutated via instance.__setstate__(state).
6005
     */
6006
    if (Py_SIZE(self->stack) - 2 < self->stack->fence)
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
6007
        return Pdata_stack_underflow(self->stack);
inline
               
Pdata_stack_underflow can be inlined into load_build with cost=95 (threshold=375) 
load_build
inline
               
Pdata_stack_underflow inlined into load_build 
load_build
6008
6009
    PDATA_POP(self->stack, state);
inline
    
Pdata_pop can be inlined into load_build with cost=140 (threshold=250) 
load_build
inline
    
Pdata_pop inlined into load_build 
load_build
6010
    if (state == NULL)
6011
        return -1;
6012
6013
    inst = self->stack->data[Py_SIZE(self->stack) - 1];
gvn
                 
load of type %struct.Pdata* eliminated in favor of load 
load_build
gvn
                        
load of type %struct._object** eliminated in favor of load 
load_build
gvn
                             
load of type i64 eliminated in favor of add 
load_build
6014
6015
    setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
inline
               
_PyObject_GetAttrId will not be inlined into load_build because its definition is unavailable 
load_build
6016
    if (setstate == NULL) {
6017
        if (PyErr_ExceptionMatches(PyExc_AttributeError))
inline
            
PyErr_ExceptionMatches will not be inlined into load_build because its definition is unavailable 
load_build
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
licm
                                   
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                   
load of type %struct._object* not eliminated because it is clobbered by call 
load
6018
            PyErr_Clear();
inline
            
PyErr_Clear will not be inlined into load_build because its definition is unavailable 
load_build
6019
        else {
6020
            Py_DECREF(state);
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
            
load of type i64 not eliminated because it is clobbered by call 
load
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6021
            return -1;
6022
        }
6023
    }
6024
    else {
6025
        PyObject *result;
6026
6027
        /* The explicit __setstate__ is responsible for everything. */
6028
        result = _Pickle_FastCall(setstate, state);
inline
                 
_Pickle_FastCall can be inlined into load_build with cost=70 (threshold=250) 
load_build
inline
                 
_Pickle_FastCall inlined into load_build 
load_build
6029
        Py_DECREF(setstate);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6030
        if (result == NULL)
6031
            return -1;
6032
        Py_DECREF(result);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6033
        return 0;
6034
    }
6035
6036
    /* A default __setstate__.  First see whether state embeds a
6037
     * slot state dict too (a proto 2 addition).
6038
     */
6039
    if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
                                
load of type i64 not eliminated because it is clobbered by call 
load
6040
        PyObject *tmp = state;
6041
6042
        state = PyTuple_GET_ITEM(tmp, 0);
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                
load of type %struct._object* not eliminated because it is clobbered by call 
load
6043
        slotstate = PyTuple_GET_ITEM(tmp, 1);
gvn
                    
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                    
load of type %struct._object* not eliminated because it is clobbered by call 
load
6044
        Py_INCREF(state);
6045
        Py_INCREF(slotstate);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
6046
        Py_DECREF(tmp);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load_build
gvn
        
load of type %struct._typeobject* eliminated in favor of load 
load_build
gvn
        
load of type void (%struct._object*)* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by store 
load
gvn
        
load of type void (%struct._object*)* not eliminated because it is clobbered by call 
load
6047
    }
6048
    else
6049
        slotstate = NULL;
6050
6051
    /* Set inst.__dict__ from the state dict (if any). */
6052
    if (state != Py_None) {
6053
        PyObject *dict;
6054
        PyObject *d_key, *d_value;
licm
        
hosting bitcast 
load
6055
        Py_ssize_t i;
licm
        
hosting bitcast 
load
6056
        _Py_IDENTIFIER(__dict__);
6057
6058
        if (!PyDict_Check(state)) {
6059
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into load_build with cost=40 (threshold=375) 
load_build
inline
                              
_Pickle_GetGlobalState inlined into load_build 
load_build
6060
            PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
inline
            
PyErr_SetString will not be inlined into load_build because its definition is unavailable 
load_build
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
load
6061
            goto error;
6062
        }
6063
        dict = _PyObject_GetAttrId(inst, &PyId___dict__);
inline
               
_PyObject_GetAttrId will not be inlined into load_build because its definition is unavailable 
load_build
6064
        if (dict == NULL)
6065
            goto error;
6066
6067
        i = 0;
6068
        while (PyDict_Next(state, &i, &d_key, &d_value)) {
inline
               
PyDict_Next will not be inlined into load_build because its definition is unavailable 
load_build
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load
loop-vectorize
        
loop not vectorized 
load
6069
            /* normally the keys for instance attributes are
6070
               interned.  we should try to do that here. */
6071
            Py_INCREF(d_key);
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
            
load of type %struct._object* not eliminated because it is clobbered by call 
load
6072
            if (PyUnicode_CheckExact(d_key))
6073
                PyUnicode_InternInPlace(&d_key);
inline
                
PyUnicode_InternInPlace will not be inlined into load_build because its definition is unavailable 
load_build
6074
            if (PyObject_SetItem(dict, d_key, d_value) < 0) {
inline
                
PyObject_SetItem will not be inlined into load_build because its definition is unavailable 
load_build
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
licm
                                              
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
gvn
                                       
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load_build
gvn
                                       
load eliminated by PRE 
load_build
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
licm
                                              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load
6075
                Py_DECREF(d_key);
licm
                
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
gvn
                
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load_build
gvn
                
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
licm
                
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
load
gvn
                
load of type i64 not eliminated because it is clobbered by call 
load
gvn
                
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6076
                goto error;
6077
            }
6078
            Py_DECREF(d_key);
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
            
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6079
        }
6080
        Py_DECREF(dict);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6081
    }
6082
6083
    /* Also set instance attributes from the slotstate dict (if any). */
6084
    if (slotstate != NULL) {
6085
        PyObject *d_key, *d_value;
licm
        
hosting bitcast 
load
6086
        Py_ssize_t i;
licm
        
hosting bitcast 
load
6087
6088
        if (!PyDict_Check(slotstate)) {
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
             
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6089
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into load_build with cost=40 (threshold=375) 
load_build
inline
                              
_Pickle_GetGlobalState inlined into load_build 
load_build
6090
            PyErr_SetString(st->UnpicklingError,
inline
            
PyErr_SetString will not be inlined into load_build because its definition is unavailable 
load_build
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
load
6091
                            "slot state is not a dictionary");
6092
            goto error;
6093
        }
6094
        i = 0;
6095
        while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
inline
               
PyDict_Next will not be inlined into load_build because its definition is unavailable 
load_build
loop-vectorize
        
loop not vectorized: loop control flow is not understood by vectorizer 
load
loop-vectorize
        
loop not vectorized 
load
6096
            if (PyObject_SetAttr(inst, d_key, d_value) < 0)
inline
                
PyObject_SetAttr will not be inlined into load_build because its definition is unavailable 
load_build
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
licm
                                              
failed to move load with loop-invariant address because the loop may invalidate its value 
load_build
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load_build
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
                                              
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                                       
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
load
6097
                goto error;
6098
        }
6099
    }
6100
6101
    if (0) {
6102
  error:
6103
        status = -1;
6104
    }
6105
6106
    Py_DECREF(state);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6107
    Py_XDECREF(slotstate);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_build
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6108
    return status;
6109
}
6110
6111
static int
6112
load_mark(UnpicklerObject *self)
6113
{
6114
6115
    /* Note that we split the (pickle.py) stack into two stacks, an
6116
     * object stack and a mark stack. Here we push a mark onto the
6117
     * mark stack.
6118
     */
6119
6120
    if ((self->num_marks + 1) >= self->marks_size) {
licm
               
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
                                       
hosting getelementptr 
load
licm
                                       
failed to move load with loop-invariant address because the loop may invalidate its value 
load
6121
        size_t alloc;
6122
6123
        /* Use the size_t type to check for overflow. */
6124
        alloc = ((size_t)self->num_marks << 1) + 20;
6125
        if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
6126
            alloc <= ((size_t)self->num_marks + 1)) {
6127
            PyErr_NoMemory();
inline
            
PyErr_NoMemory will not be inlined into load_mark because its definition is unavailable 
load_mark
6128
            return -1;
6129
        }
6130
6131
        if (self->marks == NULL)
licm
                  
hosting getelementptr 
load
licm
                  
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by store 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
gvn
                  
load of type i64* not eliminated because it is clobbered by call 
load
6132
            self->marks = PyMem_NEW(Py_ssize_t, alloc);
inline
                          
PyMem_Malloc will not be inlined into load_mark because its definition is unavailable 
load_mark
6133
        else
6134
            PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
inline
            
PyMem_Realloc will not be inlined into load_mark because its definition is unavailable 
load_mark
6135
        if (self->marks == NULL) {
6136
            self->marks_size = 0;
6137
            PyErr_NoMemory();
inline
            
PyErr_NoMemory will not be inlined into load_mark because its definition is unavailable 
load_mark
6138
            return -1;
6139
        }
6140
        self->marks_size = (Py_ssize_t)alloc;
6141
    }
6142
6143
    self->stack->mark_set = 1;
gvn
          
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_mark
gvn
          
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load_mark
licm
          
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
          
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
6144
    self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
gvn
          
load eliminated by PRE 
load_mark
gvn
                               
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_mark
gvn
                               
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_mark
gvn
                               
load eliminated by PRE 
load_mark
6145
6146
    return 0;
6147
}
6148
6149
static int
6150
load_reduce(UnpicklerObject *self)
6151
{
6152
    PyObject *callable = NULL;
6153
    PyObject *argtup = NULL;
6154
    PyObject *obj = NULL;
6155
6156
    PDATA_POP(self->stack, argtup);
inline
    
Pdata_pop can be inlined into load_reduce with cost=140 (threshold=250) 
load_reduce
inline
    
Pdata_pop inlined into load_reduce 
load_reduce
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by store 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
6157
    if (argtup == NULL)
6158
        return -1;
6159
    PDATA_POP(self->stack, callable);
inline
    
Pdata_pop can be inlined into load_reduce with cost=140 (threshold=250) 
load_reduce
inline
    
Pdata_pop inlined into load_reduce 
load_reduce
gvn
    
load of type %struct.Pdata* eliminated in favor of load 
load_reduce
6160
    if (callable) {
6161
        obj = PyObject_CallObject(callable, argtup);
inline
              
PyObject_CallObject will not be inlined into load_reduce because its definition is unavailable 
load_reduce
6162
        Py_DECREF(callable);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load_reduce
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_reduce
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6163
    }
6164
    Py_DECREF(argtup);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_reduce
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load_reduce
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load_reduce
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_reduce
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_reduce
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load_reduce
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type i64 not eliminated because it is clobbered by store 
load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
load
6165
6166
    if (obj == NULL)
6167
        return -1;
6168
6169
    PDATA_PUSH(self->stack, obj, -1);
inline
    
Pdata_push can be inlined into load_reduce with cost=150 (threshold=250) 
load_reduce
inline
    
Pdata_push inlined into load_reduce 
load_reduce
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_reduce
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_reduce
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_reduce
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load_reduce
licm
    
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
load
6170
    return 0;
6171
}
6172
6173
/* Just raises an error if we don't know the protocol specified.  PROTO
6174
 * is the first opcode for protocols >= 2.
6175
 */
6176
static int
6177
load_proto(UnpicklerObject *self)
6178
{
6179
    char *s;
6180
    int i;
6181
6182
    if (_Unpickler_Read(self, &s, 1) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_proto with cost=230 (threshold=250) 
load_proto
inline
        
_Unpickler_ReadImpl inlined into load_proto 
load_proto
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
6183
        return -1;
6184
6185
    i = (unsigned char)s[0];
gvn
                       
load of type i8 not eliminated because it is clobbered by store 
load_proto
gvn
                       
load of type i8 not eliminated because it is clobbered by store 
load
6186
    if (i <= HIGHEST_PROTOCOL) {
6187
        self->proto = i;
6188
        return 0;
6189
    }
6190
6191
    PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
inline
    
PyErr_Format will not be inlined into load_proto because its definition is unavailable 
load_proto
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load_proto
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
load
6192
    return -1;
6193
}
6194
6195
static int
6196
load_frame(UnpicklerObject *self)
6197
{
6198
    char *s;
6199
    Py_ssize_t frame_len;
6200
6201
    if (_Unpickler_Read(self, &s, 8) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_frame with cost=230 (threshold=250) 
load_frame
inline
        
_Unpickler_ReadImpl inlined into load_frame 
load_frame
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
licm
        
hosting getelementptr 
load
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load
gvn
        
load of type i64 eliminated in favor of phi 
load
gvn
        
load of type i8* eliminated in favor of phi 
load
6202
        return -1;
6203
6204
    frame_len = calc_binsize(s, 8);
inline
                
calc_binsize can be inlined into load_frame with cost=-14980 (threshold=250) 
load_frame
inline
                
calc_binsize inlined into load_frame 
load_frame
6205
    if (frame_len < 0) {
6206
        PyErr_Format(PyExc_OverflowError,
inline
        
PyErr_Format will not be inlined into load_frame because its definition is unavailable 
load_frame
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load_frame
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by store 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
gvn
                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
6207
                     "FRAME length exceeds system's maximum of %zd bytes",
6208
                     PY_SSIZE_T_MAX);
6209
        return -1;
6210
    }
6211
6212
    if (_Unpickler_Read(self, &s, frame_len) < 0)
inline
        
_Unpickler_ReadImpl can be inlined into load_frame with cost=235 (threshold=250) 
load_frame
inline
        
_Unpickler_ReadImpl inlined into load_frame 
load_frame
gvn
        
load of type i64 not eliminated in favor of load because it is clobbered by call 
load_frame
gvn
        
load of type i64 eliminated in favor of phi 
load_frame
licm
        
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
        
load of type i64 not eliminated because it is clobbered by call 
load
6213
        return -1;
6214
6215
    /* Rewind to start of frame */
6216
    self->next_read_idx -= frame_len;
6217
    return 0;
6218
}
6219
6220
static PyObject *
6221
load(UnpicklerObject *self)
6222
{
6223
    PyObject *value = NULL;
6224
    char *s = NULL;
6225
6226
    self->num_marks = 0;
6227
    self->stack->mark_set = 0;
6228
    self->stack->fence = 0;
gvn
          
load of type %struct.Pdata* eliminated in favor of load 
load
6229
    self->proto = 0;
6230
    if (Py_SIZE(self->stack))
gvn
        
load of type %struct.Pdata* eliminated in favor of load 
load
6231
        Pdata_clear(self->stack, 0);
inline
        
Pdata_clear can be inlined into load with cost=-14915 (threshold=250) 
load
inline
        
Pdata_clear inlined into load 
load
6232
6233
    /* Convenient macros for the dispatch while-switch loop just below. */
6234
#define OP(opcode, load_func) \
6235
    case opcode: if (load_func(self) < 0) break; continue;
6236
6237
#define OP_ARG(opcode, load_func, arg) \
6238
    case opcode: if (load_func(self, (arg)) < 0) break; continue;
6239
6240
    while (1) {
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
load
loop-vectorize
    
loop not vectorized 
load
6241
        if (_Unpickler_Read(self, &s, 1) < 0) {
inline
            
_Unpickler_ReadImpl can be inlined into load with cost=-14770 (threshold=250) 
load
inline
            
_Unpickler_ReadImpl inlined into load 
load
licm
            
hosting getelementptr 
load
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
load
gvn
            
load of type i8* not eliminated because it is clobbered by store 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by store 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
gvn
            
load of type i8* not eliminated because it is clobbered by call 
load
6242
            PickleState *st = _Pickle_GetGlobalState();
inline
                              
_Pickle_GetGlobalState can be inlined into load with cost=40 (threshold=375) 
load
inline
                              
_Pickle_GetGlobalState inlined into load 
load
6243
            if (PyErr_ExceptionMatches(st->UnpicklingError)) {
inline
                
PyErr_ExceptionMatches will not be inlined into load because its definition is unavailable 
load
gvn
                                           
load of type %struct._object* not eliminated because it is clobbered by call 
load
6244
                PyErr_Format(PyExc_EOFError, "Ran out of input");
inline
                
PyErr_Format will not be inlined into load because its definition is unavailable 
load
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
load
6245
            }
6246
            return NULL;
6247
        }
6248
6249
        switch ((enum opcode)s[0]) {
gvn
                             
load of type i8 not eliminated because it is clobbered by store 
load
6250
        OP(NONE, load_none)
inline
        
load_none can be inlined into load with cost=-14830 (threshold=250) 
load
inline
        
load_none inlined into load 
load
6251
        OP(BININT, load_binint)
inline
        
load_binint can be inlined into load with cost=-14510 (threshold=250) 
load
inline
        
load_binint inlined into load 
load
6252
        OP(BININT1, load_binint1)
inline
        
load_binint1 can be inlined into load with cost=-14305 (threshold=250) 
load
inline
        
load_binint1 inlined into load 
load
6253
        OP(BININT2, load_binint2)
inline
        
load_binint2 can be inlined into load with cost=-14285 (threshold=250) 
load
inline
        
load_binint2 inlined into load 
load
6254
        OP(INT, load_int)
inline
        
load_int can be inlined into load with cost=-14315 (threshold=250) 
load
inline
        
load_int inlined into load 
load
6255
        OP(LONG, load_long)
inline
        
load_long can be inlined into load with cost=-14570 (threshold=250) 
load
inline
        
load_long inlined into load 
load
6256
        OP_ARG(LONG1, load_counted_long, 1)
inline
        
load_counted_long too costly to inline (cost=655, threshold=625) 
load
inline
        
load_counted_long will not be inlined into load 
load
6257
        OP_ARG(LONG4, load_counted_long, 4)
inline
        
load_counted_long too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_long will not be inlined into load 
load
6258
        OP(FLOAT, load_float)
inline
        
load_float can be inlined into load with cost=-14405 (threshold=250) 
load
inline
        
load_float inlined into load 
load
6259
        OP(BINFLOAT, load_binfloat)
inline
        
load_binfloat can be inlined into load with cost=-14225 (threshold=250) 
load
inline
        
load_binfloat inlined into load 
load
6260
        OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
inline
        
load_counted_binbytes too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binbytes will not be inlined into load 
load
6261
        OP_ARG(BINBYTES, load_counted_binbytes, 4)
inline
        
load_counted_binbytes too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binbytes will not be inlined into load 
load
6262
        OP_ARG(BINBYTES8, load_counted_binbytes, 8)
inline
        
load_counted_binbytes too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binbytes will not be inlined into load 
load
6263
        OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
inline
        
load_counted_binstring too costly to inline (cost=640, threshold=625) 
load
inline
        
load_counted_binstring will not be inlined into load 
load
6264
        OP_ARG(BINSTRING, load_counted_binstring, 4)
inline
        
load_counted_binstring too costly to inline (cost=640, threshold=625) 
load
inline
        
load_counted_binstring will not be inlined into load 
load
6265
        OP(STRING, load_string)
inline
        
load_string can be inlined into load with cost=-14380 (threshold=250) 
load
inline
        
load_string inlined into load 
load
6266
        OP(UNICODE, load_unicode)
inline
        
load_unicode can be inlined into load with cost=-14595 (threshold=250) 
load
inline
        
load_unicode inlined into load 
load
6267
        OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
inline
        
load_counted_binunicode too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binunicode will not be inlined into load 
load
6268
        OP_ARG(BINUNICODE, load_counted_binunicode, 4)
inline
        
load_counted_binunicode too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binunicode will not be inlined into load 
load
6269
        OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
inline
        
load_counted_binunicode too costly to inline (cost=630, threshold=625) 
load
inline
        
load_counted_binunicode will not be inlined into load 
load
6270
        OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
inline
        
load_counted_tuple can be inlined into load with cost=215 (threshold=250) 
load
inline
        
load_counted_tuple inlined into load 
load
6271
        OP_ARG(TUPLE1, load_counted_tuple, 1)
inline
        
load_counted_tuple can be inlined into load with cost=215 (threshold=250) 
load
inline
        
load_counted_tuple inlined into load 
load
6272
        OP_ARG(TUPLE2, load_counted_tuple, 2)
inline
        
load_counted_tuple can be inlined into load with cost=215 (threshold=250) 
load
inline
        
load_counted_tuple inlined into load 
load
6273
        OP_ARG(TUPLE3, load_counted_tuple, 3)
inline
        
load_counted_tuple can be inlined into load with cost=-14785 (threshold=250) 
load
inline
        
load_counted_tuple inlined into load 
load
6274
        OP(TUPLE, load_tuple)
inline
        
load_tuple can be inlined into load with cost=-14230 (threshold=250) 
load
inline
        
load_tuple inlined into load 
load
6275
        OP(EMPTY_LIST, load_empty_list)
inline
        
load_empty_list can be inlined into load with cost=-14795 (threshold=250) 
load
inline
        
load_empty_list inlined into load 
load
6276
        OP(LIST, load_list)
inline
        
load_list can be inlined into load with cost=-14510 (threshold=250) 
load
inline
        
load_list inlined into load 
load
6277
        OP(EMPTY_DICT, load_empty_dict)
inline
        
load_empty_dict can be inlined into load with cost=-14800 (threshold=250) 
load
inline
        
load_empty_dict inlined into load 
load
6278
        OP(DICT, load_dict)
inline
        
load_dict can be inlined into load with cost=-14110 (threshold=250) 
load
inline
        
load_dict inlined into load 
load
6279
        OP(EMPTY_SET, load_empty_set)
inline
        
load_empty_set can be inlined into load with cost=-14795 (threshold=250) 
load
inline
        
load_empty_set inlined into load 
load
6280
        OP(ADDITEMS, load_additems)
inline
        
load_additems can be inlined into load with cost=-13810 (threshold=250) 
load
inline
        
load_additems inlined into load 
load
6281
        OP(FROZENSET, load_frozenset)
inline
        
load_frozenset can be inlined into load with cost=-14285 (threshold=250) 
load
inline
        
load_frozenset inlined into load 
load
6282
        OP(OBJ, load_obj)
inline
        
load_obj can be inlined into load with cost=-13760 (threshold=250) 
load
inline
        
load_obj inlined into load 
load
6283
        OP(INST, load_inst)
inline
        
load_inst can be inlined into load with cost=-13405 (threshold=250) 
load
inline
        
load_inst inlined into load 
load
6284
        OP(NEWOBJ, load_newobj)
inline
        
load_newobj can be inlined into load with cost=-13995 (threshold=250) 
load
inline
        
load_newobj inlined into load 
load
6285
        OP(NEWOBJ_EX, load_newobj_ex)
inline
        
load_newobj_ex can be inlined into load with cost=-13530 (threshold=250) 
load
inline
        
load_newobj_ex inlined into load 
load
6286
        OP(GLOBAL, load_global)
inline
        
load_global can be inlined into load with cost=-14155 (threshold=250) 
load
inline
        
load_global inlined into load 
load
6287
        OP(STACK_GLOBAL, load_stack_global)
inline
        
load_stack_global can be inlined into load with cost=-14055 (threshold=250) 
load
inline
        
load_stack_global inlined into load 
load
6288
        OP(APPEND, load_append)
inline
        
load_append can be inlined into load with cost=-14835 (threshold=250) 
load
inline
        
load_append inlined into load 
load
6289
        OP(APPENDS, load_appends)
inline
        
load_appends can be inlined into load with cost=-14785 (threshold=250) 
load
inline
        
load_appends inlined into load 
load
6290
        OP(BUILD, load_build)
inline
        
load_build can be inlined into load with cost=-13190 (threshold=250) 
load
inline
        
load_build inlined into load 
load
6291
        OP(DUP, load_dup)
inline
        
load_dup can be inlined into load with cost=-14675 (threshold=250) 
load
inline
        
load_dup inlined into load 
load
6292
        OP(BINGET, load_binget)
inline
        
load_binget can be inlined into load with cost=-14160 (threshold=250) 
load
inline
        
load_binget inlined into load 
load
6293
        OP(LONG_BINGET, load_long_binget)
inline
        
load_long_binget can be inlined into load with cost=-14100 (threshold=250) 
load
inline
        
load_long_binget inlined into load 
load
6294
        OP(GET, load_get)
inline
        
load_get can be inlined into load with cost=-14230 (threshold=250) 
load
inline
        
load_get inlined into load 
load
6295
        OP(MARK, load_mark)
inline
        
load_mark can be inlined into load with cost=-14745 (threshold=250) 
load
inline
        
load_mark inlined into load 
load
6296
        OP(BINPUT, load_binput)
inline
        
load_binput can be inlined into load with cost=-14325 (threshold=250) 
load
inline
        
load_binput inlined into load 
load
6297
        OP(LONG_BINPUT, load_long_binput)
inline
        
load_long_binput can be inlined into load with cost=-14265 (threshold=250) 
load
inline
        
load_long_binput inlined into load 
load
6298
        OP(PUT, load_put)
inline
        
load_put can be inlined into load with cost=-14400 (threshold=250) 
load
inline
        
load_put inlined into load 
load
6299
        OP(MEMOIZE, load_memoize)
inline
        
load_memoize can be inlined into load with cost=-14810 (threshold=250) 
load
inline
        
load_memoize inlined into load 
load
6300
        OP(POP, load_pop)
inline
        
load_pop can be inlined into load with cost=-14715 (threshold=250) 
load
inline
        
load_pop inlined into load 
load
6301
        OP(POP_MARK, load_pop_mark)
inline
        
load_pop_mark can be inlined into load with cost=-14700 (threshold=250) 
load
inline
        
load_pop_mark inlined into load 
load
6302
        OP(SETITEM, load_setitem)
inline
        
load_setitem can be inlined into load with cost=-14980 (threshold=375) 
load
inline
        
load_setitem inlined into load 
load
6303
        OP(SETITEMS, load_setitems)
inline
        
load_setitems can be inlined into load with cost=-14785 (threshold=250) 
load
inline
        
load_setitems inlined into load 
load
6304
        OP(PERSID, load_persid)
inline
        
load_persid can be inlined into load with cost=-14175 (threshold=250) 
load
inline
        
load_persid inlined into load 
load
6305
        OP(BINPERSID, load_binpersid)
inline
        
load_binpersid can be inlined into load with cost=-14400 (threshold=250) 
load
inline
        
load_binpersid inlined into load 
load
6306
        OP(REDUCE, load_reduce)
inline
        
load_reduce can be inlined into load with cost=-14340 (threshold=250) 
load
inline
        
load_reduce inlined into load 
load
6307
        OP(PROTO, load_proto)
inline
        
load_proto can be inlined into load with cost=-14480 (threshold=250) 
load
inline
        
load_proto inlined into load 
load
6308
        OP(FRAME, load_frame)
inline
        
load_frame can be inlined into load with cost=-13865 (threshold=250) 
load
inline
        
load_frame inlined into load 
load
6309
        OP_ARG(EXT1, load_extension, 1)
inline
        
load_extension too costly to inline (cost=645, threshold=625) 
load
inline
        
load_extension will not be inlined into load 
load
6310
        OP_ARG(EXT2, load_extension, 2)
inline
        
load_extension too costly to inline (cost=645, threshold=625) 
load
inline
        
load_extension will not be inlined into load 
load
6311
        OP_ARG(EXT4, load_extension, 4)
inline
        
load_extension too costly to inline (cost=660, threshold=625) 
load
inline
        
load_extension will not be inlined into load 
load
6312
        OP_ARG(NEWTRUE, load_bool, Py_True)
inline
        
load_bool can be inlined into load with cost=165 (threshold=250) 
load
inline
        
load_bool inlined into load 
load
6313
        OP_ARG(NEWFALSE, load_bool, Py_False)
inline
        
load_bool can be inlined into load with cost=-14835 (threshold=250) 
load
inline
        
load_bool inlined into load 
load
6314
6315
        case STOP:
6316
            break;
6317
6318
        default:
6319
            {
6320
                PickleState *st = _Pickle_GetGlobalState();
inline
                                  
_Pickle_GetGlobalState can be inlined into load with cost=40 (threshold=375) 
load
inline
                                  
_Pickle_GetGlobalState inlined into load 
load
6321
                unsigned char c = (unsigned char) *s;
gvn
                                                  
load of type i8 not eliminated in favor of load because it is clobbered by call 
load
6322
                if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6323
                    PyErr_Format(st->UnpicklingError,
inline
                    
PyErr_Format will not be inlined into load because its definition is unavailable 
load
gvn
                                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
6324
                                 "invalid load key, '%c'.", c);
6325
                }
6326
                else {
6327
                    PyErr_Format(st->UnpicklingError,
inline
                    
PyErr_Format will not be inlined into load because its definition is unavailable 
load
gvn
                                     
load of type %struct._object* not eliminated because it is clobbered by call 
load
6328
                                 "invalid load key, '\\x%02x'.", c);
6329
                }
6330
                return NULL;
6331
            }
6332
        }
6333
6334
        break;                  /* and we are done! */
6335
    }
6336
6337
    if (PyErr_Occurred()) {
inline
        
PyErr_Occurred will not be inlined into load because its definition is unavailable 
load
6338
        return NULL;
6339
    }
6340
6341
    if (_Unpickler_SkipConsumed(self) < 0)
inline
        
_Unpickler_SkipConsumed can be inlined into load with cost=-14895 (threshold=250) 
load
inline
        
_Unpickler_SkipConsumed inlined into load 
load
6342
        return NULL;
6343
6344
    PDATA_POP(self->stack, value);
inline
    
Pdata_pop can be inlined into load with cost=-14860 (threshold=250) 
load
inline
    
Pdata_pop inlined into load 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
gvn
    
load of type %struct.Pdata* not eliminated in favor of load because it is clobbered by call 
load
6345
    return value;
6346
}
6347
6348
/*[clinic input]
6349
6350
_pickle.Unpickler.load
6351
6352
Load a pickle.
6353
6354
Read a pickled object representation from the open file object given
6355
in the constructor, and return the reconstituted object hierarchy
6356
specified therein.
6357
[clinic start generated code]*/
6358
6359
static PyObject *
6360
_pickle_Unpickler_load_impl(UnpicklerObject *self)
6361
/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
6362
{
6363
    UnpicklerObject *unpickler = (UnpicklerObject*)self;
6364
6365
    /* Check whether the Unpickler was initialized correctly. This prevents
6366
       segfaulting if a subclass overridden __init__ with a function that does
6367
       not call Unpickler.__init__(). Here, we simply ensure that self->read
6368
       is not NULL. */
6369
    if (unpickler->read == NULL) {
6370
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into _pickle_Unpickler_load_impl with cost=40 (threshold=375) 
_pickle_Unpickler_load_impl
inline
                          
_Pickle_GetGlobalState inlined into _pickle_Unpickler_load_impl 
_pickle_Unpickler_load_impl
6371
        PyErr_Format(st->UnpicklingError,
inline
        
PyErr_Format will not be inlined into _pickle_Unpickler_load_impl because its definition is unavailable 
_pickle_Unpickler_load_impl
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_load_impl
gvn
                         
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_load
6372
                     "Unpickler.__init__() was not called by %s.__init__()",
6373
                     Py_TYPE(unpickler)->tp_name);
gvn
                     
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_load_impl
gvn
                                         
load of type i8* not eliminated because it is clobbered by call 
_pickle_Unpickler_load_impl
gvn
                     
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_load
gvn
                                         
load of type i8* not eliminated because it is clobbered by call 
_pickle_Unpickler_load
6374
        return NULL;
6375
    }
6376
6377
    return load(unpickler);
inline
           
load too costly to inline (cost=655, threshold=625) 
_pickle_Unpickler_load_impl
inline
           
load will not be inlined into _pickle_Unpickler_load_impl 
_pickle_Unpickler_load_impl
inline
           
load too costly to inline (cost=655, threshold=625) 
_pickle_Unpickler_load
inline
           
load will not be inlined into _pickle_Unpickler_load 
_pickle_Unpickler_load
6378
}
6379
6380
/* The name of find_class() is misleading. In newer pickle protocols, this
6381
   function is used for loading any global (i.e., functions), not just
6382
   classes. The name is kept only for backward compatibility. */
6383
6384
/*[clinic input]
6385
6386
_pickle.Unpickler.find_class
6387
6388
  module_name: object
6389
  global_name: object
6390
  /
6391
6392
Return an object from a specified module.
6393
6394
If necessary, the module will be imported. Subclasses may override
6395
this method (e.g. to restrict unpickling of arbitrary classes and
6396
functions).
6397
6398
This method is called whenever a class or a function object is
6399
needed.  Both arguments passed are str objects.
6400
[clinic start generated code]*/
6401
6402
static PyObject *
6403
_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6404
                                  PyObject *module_name,
6405
                                  PyObject *global_name)
6406
/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
6407
{
6408
    PyObject *global;
6409
    PyObject *modules_dict;
6410
    PyObject *module;
6411
    _Py_IDENTIFIER(modules);
6412
6413
    /* Try to map the old names used in Python 2.x to the new ones used in
6414
       Python 3.x.  We do this only with old pickle protocols and when the
6415
       user has not disabled the feature. */
6416
    if (self->proto < 3 && self->fix_imports) {
gvn
              
load of type i32 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                                 
load of type i32 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6417
        PyObject *key;
6418
        PyObject *item;
6419
        PickleState *st = _Pickle_GetGlobalState();
inline
                          
_Pickle_GetGlobalState can be inlined into _pickle_Unpickler_find_class_impl with cost=40 (threshold=375) 
_pickle_Unpickler_find_class_impl
inline
                          
_Pickle_GetGlobalState inlined into _pickle_Unpickler_find_class_impl 
_pickle_Unpickler_find_class_impl
6420
6421
        /* Check if the global (i.e., a function or a class) was renamed
6422
           or moved to another module. */
6423
        key = PyTuple_Pack(2, module_name, global_name);
inline
              
PyTuple_Pack will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6424
        if (key == NULL)
6425
            return NULL;
6426
        item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
inline
               
PyDict_GetItemWithError will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                                           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                                           
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6427
        Py_DECREF(key);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6428
        if (item) {
6429
            if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
gvn
                 
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                 
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                                        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                                        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                 
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                 
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                                        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                                        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6430
                PyErr_Format(PyExc_RuntimeError,
inline
                
PyErr_Format will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6431
                             "_compat_pickle.NAME_MAPPING values should be "
6432
                             "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6433
                return NULL;
6434
            }
6435
            module_name = PyTuple_GET_ITEM(item, 0);
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6436
            global_name = PyTuple_GET_ITEM(item, 1);
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                          
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6437
            if (!PyUnicode_Check(module_name) ||
6438
                !PyUnicode_Check(global_name)) {
6439
                PyErr_Format(PyExc_RuntimeError,
inline
                
PyErr_Format will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
                             
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6440
                             "_compat_pickle.NAME_MAPPING values should be "
6441
                             "pairs of str, not (%.200s, %.200s)",
6442
                             Py_TYPE(module_name)->tp_name,
6443
                             Py_TYPE(global_name)->tp_name);
6444
                return NULL;
6445
            }
6446
        }
6447
        else if (PyErr_Occurred()) {
inline
                 
PyErr_Occurred will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6448
            return NULL;
6449
        }
6450
        else {
6451
            /* Check if the module was renamed. */
6452
            item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
inline
                   
PyDict_GetItemWithError will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                                               
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                                               
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6453
            if (item) {
6454
                if (!PyUnicode_Check(item)) {
gvn
                     
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                     
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6455
                    PyErr_Format(PyExc_RuntimeError,
inline
                    
PyErr_Format will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                                 
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6456
                                "_compat_pickle.IMPORT_MAPPING values should be "
6457
                                "strings, not %.200s", Py_TYPE(item)->tp_name);
6458
                    return NULL;
6459
                }
6460
                module_name = item;
6461
            }
6462
            else if (PyErr_Occurred()) {
inline
                     
PyErr_Occurred will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6463
                return NULL;
6464
            }
6465
        }
6466
    }
6467
6468
    modules_dict = _PySys_GetObjectId(&PyId_modules);
inline
                   
_PySys_GetObjectId will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6469
    if (modules_dict == NULL) {
6470
        PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
inline
        
PyErr_SetString will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6471
        return NULL;
6472
    }
6473
6474
    module = PyDict_GetItemWithError(modules_dict, module_name);
inline
             
PyDict_GetItemWithError will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6475
    if (module == NULL) {
6476
        if (PyErr_Occurred())
inline
            
PyErr_Occurred will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6477
            return NULL;
6478
        module = PyImport_Import(module_name);
inline
                 
PyImport_Import will not be inlined into _pickle_Unpickler_find_class_impl because its definition is unavailable 
_pickle_Unpickler_find_class_impl
6479
        if (module == NULL)
6480
            return NULL;
6481
        global = getattribute(module, global_name, self->proto >= 4);
inline
                 
getattribute too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler_find_class_impl
inline
                 
getattribute will not be inlined into _pickle_Unpickler_find_class_impl 
_pickle_Unpickler_find_class_impl
gvn
                                                         
load of type i32 not eliminated in favor of load because it is clobbered by call 
_pickle_Unpickler_find_class_impl
inline
                 
getattribute too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler_find_class
inline
                 
getattribute will not be inlined into _pickle_Unpickler_find_class 
_pickle_Unpickler_find_class
gvn
                                                         
load of type i32 not eliminated in favor of load because it is clobbered by call 
_pickle_Unpickler_find_class
6482
        Py_DECREF(module);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class_impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_Unpickler_find_class
6483
    }
6484
    else {
6485
        global = getattribute(module, global_name, self->proto >= 4);
inline
                 
getattribute too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler_find_class_impl
inline
                 
getattribute will not be inlined into _pickle_Unpickler_find_class_impl 
_pickle_Unpickler_find_class_impl
gvn
                                                         
load of type i32 not eliminated in favor of load because it is clobbered by call 
_pickle_Unpickler_find_class_impl
inline
                 
getattribute too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler_find_class
inline
                 
getattribute will not be inlined into _pickle_Unpickler_find_class 
_pickle_Unpickler_find_class
gvn
                                                         
load of type i32 not eliminated in favor of load because it is clobbered by call 
_pickle_Unpickler_find_class
6486
    }
6487
    return global;
6488
}
6489
6490
/*[clinic input]
6491
6492
_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6493
6494
Returns size in memory, in bytes.
6495
[clinic start generated code]*/
6496
6497
static Py_ssize_t
6498
_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6499
/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6500
{
6501
    Py_ssize_t res;
6502
6503
    res = _PyObject_SIZE(Py_TYPE(self));
6504
    if (self->memo != NULL)
6505
        res += self->memo_size * sizeof(PyObject *);
6506
    if (self->marks != NULL)
6507
        res += self->marks_size * sizeof(Py_ssize_t);
6508
    if (self->input_line != NULL)
6509
        res += strlen(self->input_line) + 1;
inline
               
strlen will not be inlined into _pickle_Unpickler___sizeof___impl because its definition is unavailable 
_pickle_Unpickler___sizeof___impl
6510
    if (self->encoding != NULL)
6511
        res += strlen(self->encoding) + 1;
inline
               
strlen will not be inlined into _pickle_Unpickler___sizeof___impl because its definition is unavailable 
_pickle_Unpickler___sizeof___impl
6512
    if (self->errors != NULL)
6513
        res += strlen(self->errors) + 1;
inline
               
strlen will not be inlined into _pickle_Unpickler___sizeof___impl because its definition is unavailable 
_pickle_Unpickler___sizeof___impl
6514
    return res;
6515
}
6516
6517
static struct PyMethodDef Unpickler_methods[] = {
6518
    _PICKLE_UNPICKLER_LOAD_METHODDEF
6519
    _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
6520
    _PICKLE_UNPICKLER___SIZEOF___METHODDEF
6521
    {NULL, NULL}                /* sentinel */
6522
};
6523
6524
static void
6525
Unpickler_dealloc(UnpicklerObject *self)
6526
{
6527
    PyObject_GC_UnTrack((PyObject *)self);
inline
    
PyObject_GC_UnTrack will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
6528
    Py_XDECREF(self->readline);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Unpickler_dealloc
6529
    Py_XDECREF(self->read);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
6530
    Py_XDECREF(self->peek);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
6531
    Py_XDECREF(self->stack);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
6532
    Py_XDECREF(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_dealloc
6533
    if (self->buffer.buf != NULL) {
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
6534
        PyBuffer_Release(&self->buffer);
inline
        
PyBuffer_Release will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
6535
        self->buffer.buf = NULL;
6536
    }
6537
6538
    _Unpickler_MemoCleanup(self);
inline
    
_Unpickler_MemoCleanup can be inlined into Unpickler_dealloc with cost=120 (threshold=250) 
Unpickler_dealloc
inline
    
_Unpickler_MemoCleanup inlined into Unpickler_dealloc 
Unpickler_dealloc
6539
    PyMem_Free(self->marks);
inline
    
PyMem_Free will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
6540
    PyMem_Free(self->input_line);
inline
    
PyMem_Free will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
6541
    PyMem_Free(self->encoding);
inline
    
PyMem_Free will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
6542
    PyMem_Free(self->errors);
inline
    
PyMem_Free will not be inlined into Unpickler_dealloc because its definition is unavailable 
Unpickler_dealloc
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_dealloc
6543
6544
    Py_TYPE(self)->tp_free((PyObject *)self);
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
Unpickler_dealloc
gvn
                   
load of type void (i8*)* not eliminated because it is clobbered by call 
Unpickler_dealloc
6545
}
6546
6547
static int
6548
Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6549
{
6550
    Py_VISIT(self->readline);
6551
    Py_VISIT(self->read);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
6552
    Py_VISIT(self->peek);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
6553
    Py_VISIT(self->stack);
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct.Pdata* not eliminated because it is clobbered by call 
Unpickler_traverse
6554
    Py_VISIT(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_traverse
6555
    return 0;
6556
}
6557
6558
static int
6559
Unpickler_clear(UnpicklerObject *self)
6560
{
6561
    Py_CLEAR(self->readline);
6562
    Py_CLEAR(self->read);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
6563
    Py_CLEAR(self->peek);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
6564
    Py_CLEAR(self->stack);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
6565
    Py_CLEAR(self->pers_func);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_clear
6566
    if (self->buffer.buf != NULL) {
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
6567
        PyBuffer_Release(&self->buffer);
inline
        
PyBuffer_Release will not be inlined into Unpickler_clear because its definition is unavailable 
Unpickler_clear
6568
        self->buffer.buf = NULL;
6569
    }
6570
6571
    _Unpickler_MemoCleanup(self);
inline
    
_Unpickler_MemoCleanup can be inlined into Unpickler_clear with cost=120 (threshold=250) 
Unpickler_clear
inline
    
_Unpickler_MemoCleanup inlined into Unpickler_clear 
Unpickler_clear
6572
    PyMem_Free(self->marks);
inline
    
PyMem_Free will not be inlined into Unpickler_clear because its definition is unavailable 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
6573
    self->marks = NULL;
6574
    PyMem_Free(self->input_line);
inline
    
PyMem_Free will not be inlined into Unpickler_clear because its definition is unavailable 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
6575
    self->input_line = NULL;
6576
    PyMem_Free(self->encoding);
inline
    
PyMem_Free will not be inlined into Unpickler_clear because its definition is unavailable 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
6577
    self->encoding = NULL;
6578
    PyMem_Free(self->errors);
inline
    
PyMem_Free will not be inlined into Unpickler_clear because its definition is unavailable 
Unpickler_clear
gvn
                     
load of type i8* not eliminated because it is clobbered by call 
Unpickler_clear
6579
    self->errors = NULL;
6580
6581
    return 0;
6582
}
6583
6584
/*[clinic input]
6585
6586
_pickle.Unpickler.__init__
6587
6588
  file: object
6589
  *
6590
  fix_imports: bool = True
6591
  encoding: str = 'ASCII'
6592
  errors: str = 'strict'
6593
6594
This takes a binary file for reading a pickle data stream.
6595
6596
The protocol version of the pickle is detected automatically, so no
6597
protocol argument is needed.  Bytes past the pickled object's
6598
representation are ignored.
6599
6600
The argument *file* must have two methods, a read() method that takes
6601
an integer argument, and a readline() method that requires no
6602
arguments.  Both methods should return bytes.  Thus *file* can be a
6603
binary file object opened for reading, an io.BytesIO object, or any
6604
other custom object that meets this interface.
6605
6606
Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6607
which are used to control compatibility support for pickle stream
6608
generated by Python 2.  If *fix_imports* is True, pickle will try to
6609
map the old Python 2 names to the new names used in Python 3.  The
6610
*encoding* and *errors* tell pickle how to decode 8-bit string
6611
instances pickled by Python 2; these default to 'ASCII' and 'strict',
6612
respectively.  The *encoding* can be 'bytes' to read these 8-bit
6613
string instances as bytes objects.
6614
[clinic start generated code]*/
6615
6616
static int
6617
_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6618
                                int fix_imports, const char *encoding,
6619
                                const char *errors)
6620
/*[clinic end generated code: output=e2c8ce748edc57b0 input=f9b7da04f5f4f335]*/
6621
{
6622
    _Py_IDENTIFIER(persistent_load);
6623
6624
    /* In case of multiple __init__() calls, clear previous content. */
6625
    if (self->read != NULL)
gvn
              
load of type %struct._object* not eliminated because it is clobbered by call 
_pickle_Unpickler___init__
6626
        (void)Unpickler_clear(self);
inline
              
Unpickler_clear too costly to inline (cost=630, threshold=625) 
_pickle_Unpickler___init___impl
inline
              
Unpickler_clear will not be inlined into _pickle_Unpickler___init___impl 
_pickle_Unpickler___init___impl
inline
              
Unpickler_clear too costly to inline (cost=630, threshold=625) 
_pickle_Unpickler___init__
inline
              
Unpickler_clear will not be inlined into _pickle_Unpickler___init__ 
_pickle_Unpickler___init__
6627
6628
    if (_Unpickler_SetInputStream(self, file) < 0)
inline
        
_Unpickler_SetInputStream too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler___init___impl
inline
        
_Unpickler_SetInputStream will not be inlined into _pickle_Unpickler___init___impl 
_pickle_Unpickler___init___impl
inline
        
_Unpickler_SetInputStream too costly to inline (cost=500, threshold=250) 
_pickle_Unpickler___init__
inline
        
_Unpickler_SetInputStream will not be inlined into _pickle_Unpickler___init__ 
_pickle_Unpickler___init__
6629
        return -1;
6630
6631
    if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
inline
        
_Unpickler_SetInputEncoding can be inlined into _pickle_Unpickler___init___impl with cost=-14890 (threshold=250) 
_pickle_Unpickler___init___impl
inline
        
_Unpickler_SetInputEncoding inlined into _pickle_Unpickler___init___impl 
_pickle_Unpickler___init___impl
6632
        return -1;
6633
6634
    self->fix_imports = fix_imports;
6635
    if (self->fix_imports == -1)
6636
        return -1;
6637
6638
    if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
inline
        
_PyObject_HasAttrId will not be inlined into _pickle_Unpickler___init___impl because its definition is unavailable 
_pickle_Unpickler___init___impl
6639
        self->pers_func = _PyObject_GetAttrId((PyObject *)self,
inline
                          
_PyObject_GetAttrId will not be inlined into _pickle_Unpickler___init___impl because its definition is unavailable 
_pickle_Unpickler___init___impl
6640
                                              &PyId_persistent_load);
6641
        if (self->pers_func == NULL)
6642
            return 1;
6643
    }
6644
    else {
6645
        self->pers_func = NULL;
6646
    }
6647
6648
    self->stack = (Pdata *)Pdata_New();
inline
                           
Pdata_New can be inlined into _pickle_Unpickler___init___impl with cost=-14840 (threshold=250) 
_pickle_Unpickler___init___impl
inline
                           
Pdata_New inlined into _pickle_Unpickler___init___impl 
_pickle_Unpickler___init___impl
6649
    if (self->stack == NULL)
6650
        return 1;
6651
6652
    self->memo_size = 32;
6653
    self->memo = _Unpickler_NewMemo(self->memo_size);
inline
                 
_Unpickler_NewMemo can be inlined into _pickle_Unpickler___init___impl with cost=45 (threshold=250) 
_pickle_Unpickler___init___impl
inline
                 
_Unpickler_NewMemo inlined into _pickle_Unpickler___init___impl 
_pickle_Unpickler___init___impl
6654
    if (self->memo == NULL)
6655
        return -1;
6656
6657
    self->proto = 0;
6658
6659
    return 0;
6660
}
6661
6662
6663
/* Define a proxy object for the Unpickler's internal memo object. This is to
6664
 * avoid breaking code like:
6665
 *  unpickler.memo.clear()
6666
 * and
6667
 *  unpickler.memo = saved_memo
6668
 * Is this a good idea? Not really, but we don't want to break code that uses
6669
 * it. Note that we don't implement the entire mapping API here. This is
6670
 * intentional, as these should be treated as black-box implementation details.
6671
 *
6672
 * We do, however, have to implement pickling/unpickling support because of
6673
 * real-world code like cvs2svn.
6674
 */
6675
6676
/*[clinic input]
6677
_pickle.UnpicklerMemoProxy.clear
6678
6679
Remove all items from memo.
6680
[clinic start generated code]*/
6681
6682
static PyObject *
6683
_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
6684
/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
6685
{
6686
    _Unpickler_MemoCleanup(self->unpickler);
inline
    
_Unpickler_MemoCleanup can be inlined into _pickle_UnpicklerMemoProxy_clear_impl with cost=-14880 (threshold=250) 
_pickle_UnpicklerMemoProxy_clear_impl
inline
    
_Unpickler_MemoCleanup inlined into _pickle_UnpicklerMemoProxy_clear_impl 
_pickle_UnpicklerMemoProxy_clear_impl
6687
    self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
inline
                            
_Unpickler_NewMemo can be inlined into _pickle_UnpicklerMemoProxy_clear_impl with cost=-14940 (threshold=250) 
_pickle_UnpicklerMemoProxy_clear_impl
inline
                            
_Unpickler_NewMemo inlined into _pickle_UnpicklerMemoProxy_clear_impl 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
                                                     
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
                                                     
load eliminated by PRE 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear
gvn
          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear
6688
    if (self->unpickler->memo == NULL)
gvn
              
load of type %struct.UnpicklerObject* eliminated in favor of load 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
                         
load of type %struct._object** eliminated in favor of phi 
_pickle_UnpicklerMemoProxy_clear_impl
6689
        return NULL;
6690
    Py_RETURN_NONE;
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_clear
6691
}
6692
6693
/*[clinic input]
6694
_pickle.UnpicklerMemoProxy.copy
6695
6696
Copy the memo to a new object.
6697
[clinic start generated code]*/
6698
6699
static PyObject *
6700
_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
6701
/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
6702
{
6703
    Py_ssize_t i;
6704
    PyObject *new_memo = PyDict_New();
inline
                         
PyDict_New will not be inlined into _pickle_UnpicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_UnpicklerMemoProxy_copy_impl
6705
    if (new_memo == NULL)
6706
        return NULL;
6707
6708
    for (i = 0; i < self->unpickler->memo_size; i++) {
licm
                          
failed to move load with loop-invariant address because the loop may invalidate its value 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
                          
load of type %struct.UnpicklerObject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
                          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
                          
load of type %struct.UnpicklerObject* not eliminated in favor of load because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
                          
load eliminated by PRE 
_pickle_UnpicklerMemoProxy_copy_impl
loop-vectorize
    
loop not vectorized: loop control flow is not understood by vectorizer 
_pickle_UnpicklerMemoProxy_copy_impl
loop-vectorize
    
loop not vectorized 
_pickle_UnpicklerMemoProxy_copy_impl
6709
        int status;
6710
        PyObject *key, *value;
6711
6712
        value = self->unpickler->memo[i];
6713
        if (value == NULL)
6714
            continue;
6715
6716
        key = PyLong_FromSsize_t(i);
inline
              
PyLong_FromSsize_t will not be inlined into _pickle_UnpicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_UnpicklerMemoProxy_copy_impl
6717
        if (key == NULL)
6718
            goto error;
6719
        status = PyDict_SetItem(new_memo, key, value);
inline
                 
PyDict_SetItem will not be inlined into _pickle_UnpicklerMemoProxy_copy_impl because its definition is unavailable 
_pickle_UnpicklerMemoProxy_copy_impl
6720
        Py_DECREF(key);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
6721
        if (status < 0)
6722
            goto error;
6723
    }
6724
    return new_memo;
6725
6726
error:
6727
    Py_DECREF(new_memo);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy_copy_impl
6728
    return NULL;
6729
}
6730
6731
/*[clinic input]
6732
_pickle.UnpicklerMemoProxy.__reduce__
6733
6734
Implement pickling support.
6735
[clinic start generated code]*/
6736
6737
static PyObject *
6738
_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
6739
/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
6740
{
6741
    PyObject *reduce_value;
6742
    PyObject *constructor_args;
6743
    PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
inline
                         
_pickle_UnpicklerMemoProxy_copy_impl too costly to inline (cost=265, threshold=250) 
_pickle_UnpicklerMemoProxy___reduce___impl
inline
                         
_pickle_UnpicklerMemoProxy_copy_impl will not be inlined into _pickle_UnpicklerMemoProxy___reduce___impl 
_pickle_UnpicklerMemoProxy___reduce___impl
inline
                         
_pickle_UnpicklerMemoProxy_copy_impl too costly to inline (cost=265, threshold=250) 
_pickle_UnpicklerMemoProxy___reduce__
inline
                         
_pickle_UnpicklerMemoProxy_copy_impl will not be inlined into _pickle_UnpicklerMemoProxy___reduce__ 
_pickle_UnpicklerMemoProxy___reduce__
6744
    if (contents == NULL)
6745
        return NULL;
6746
6747
    reduce_value = PyTuple_New(2);
inline
                   
PyTuple_New will not be inlined into _pickle_UnpicklerMemoProxy___reduce___impl because its definition is unavailable 
_pickle_UnpicklerMemoProxy___reduce___impl
6748
    if (reduce_value == NULL) {
6749
        Py_DECREF(contents);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
6750
        return NULL;
6751
    }
6752
    constructor_args = PyTuple_New(1);
inline
                       
PyTuple_New will not be inlined into _pickle_UnpicklerMemoProxy___reduce___impl because its definition is unavailable 
_pickle_UnpicklerMemoProxy___reduce___impl
6753
    if (constructor_args == NULL) {
6754
        Py_DECREF(contents);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
6755
        Py_DECREF(reduce_value);
gvn
        
load of type i64 not eliminated because it is clobbered by store 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
        
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
gvn
        
load of type i64 not eliminated because it is clobbered by store 
_pickle_UnpicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
gvn
        
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
6756
        return NULL;
6757
    }
6758
    PyTuple_SET_ITEM(constructor_args, 0, contents);
6759
    Py_INCREF((PyObject *)&PyDict_Type);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce___impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_UnpicklerMemoProxy___reduce__
6760
    PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6761
    PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6762
    return reduce_value;
6763
}
6764
6765
static PyMethodDef unpicklerproxy_methods[] = {
6766
    _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6767
    _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6768
    _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
6769
    {NULL, NULL}    /* sentinel */
6770
};
6771
6772
static void
6773
UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6774
{
6775
    PyObject_GC_UnTrack(self);
inline
    
PyObject_GC_UnTrack will not be inlined into UnpicklerMemoProxy_dealloc because its definition is unavailable 
UnpicklerMemoProxy_dealloc
6776
    Py_XDECREF(self->unpickler);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
UnpicklerMemoProxy_dealloc
gvn
    
load of type i64 not eliminated because it is clobbered by call 
UnpicklerMemoProxy_dealloc
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
UnpicklerMemoProxy_dealloc
6777
    PyObject_GC_Del((PyObject *)self);
inline
    
PyObject_GC_Del will not be inlined into UnpicklerMemoProxy_dealloc because its definition is unavailable 
UnpicklerMemoProxy_dealloc
6778
}
6779
6780
static int
6781
UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6782
                            visitproc visit, void *arg)
6783
{
6784
    Py_VISIT(self->unpickler);
6785
    return 0;
6786
}
6787
6788
static int
6789
UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6790
{
6791
    Py_CLEAR(self->unpickler);
6792
    return 0;
6793
}
6794
6795
static PyTypeObject UnpicklerMemoProxyType = {
6796
    PyVarObject_HEAD_INIT(NULL, 0)
6797
    "_pickle.UnpicklerMemoProxy",               /*tp_name*/
6798
    sizeof(UnpicklerMemoProxyObject),           /*tp_basicsize*/
6799
    0,
6800
    (destructor)UnpicklerMemoProxy_dealloc,     /* tp_dealloc */
6801
    0,                                          /* tp_print */
6802
    0,                                          /* tp_getattr */
6803
    0,                                          /* tp_setattr */
6804
    0,                                          /* tp_compare */
6805
    0,                                          /* tp_repr */
6806
    0,                                          /* tp_as_number */
6807
    0,                                          /* tp_as_sequence */
6808
    0,                                          /* tp_as_mapping */
6809
    PyObject_HashNotImplemented,                /* tp_hash */
6810
    0,                                          /* tp_call */
6811
    0,                                          /* tp_str */
6812
    PyObject_GenericGetAttr,                    /* tp_getattro */
6813
    PyObject_GenericSetAttr,                    /* tp_setattro */
6814
    0,                                          /* tp_as_buffer */
6815
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6816
    0,                                          /* tp_doc */
6817
    (traverseproc)UnpicklerMemoProxy_traverse,  /* tp_traverse */
6818
    (inquiry)UnpicklerMemoProxy_clear,          /* tp_clear */
6819
    0,                                          /* tp_richcompare */
6820
    0,                                          /* tp_weaklistoffset */
6821
    0,                                          /* tp_iter */
6822
    0,                                          /* tp_iternext */
6823
    unpicklerproxy_methods,                     /* tp_methods */
6824
};
6825
6826
static PyObject *
6827
UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6828
{
6829
    UnpicklerMemoProxyObject *self;
6830
6831
    self = PyObject_GC_New(UnpicklerMemoProxyObject,
inline
           
_PyObject_GC_New will not be inlined into UnpicklerMemoProxy_New because its definition is unavailable 
UnpicklerMemoProxy_New
6832
                           &UnpicklerMemoProxyType);
6833
    if (self == NULL)
6834
        return NULL;
6835
    Py_INCREF(unpickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
UnpicklerMemoProxy_New
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Unpickler_get_memo
6836
    self->unpickler = unpickler;
6837
    PyObject_GC_Track(self);
inline
    
PyObject_GC_Track will not be inlined into UnpicklerMemoProxy_New because its definition is unavailable 
UnpicklerMemoProxy_New
6838
    return (PyObject *)self;
6839
}
6840
6841
/*****************************************************************************/
6842
6843
6844
static PyObject *
6845
Unpickler_get_memo(UnpicklerObject *self)
6846
{
6847
    return UnpicklerMemoProxy_New(self);
inline
           
UnpicklerMemoProxy_New can be inlined into Unpickler_get_memo with cost=-14935 (threshold=250) 
Unpickler_get_memo
inline
           
UnpicklerMemoProxy_New inlined into Unpickler_get_memo 
Unpickler_get_memo
6848
}
6849
6850
static int
6851
Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
6852
{
6853
    PyObject **new_memo;
6854
    Py_ssize_t new_memo_size = 0;
6855
    Py_ssize_t i;
6856
6857
    if (obj == NULL) {
6858
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6859
                        "attribute deletion is not supported");
6860
        return -1;
6861
    }
6862
6863
    if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6864
        UnpicklerObject *unpickler =
6865
            ((UnpicklerMemoProxyObject *)obj)->unpickler;
6866
6867
        new_memo_size = unpickler->memo_size;
6868
        new_memo = _Unpickler_NewMemo(new_memo_size);
inline
                   
_Unpickler_NewMemo can be inlined into Unpickler_set_memo with cost=60 (threshold=250) 
Unpickler_set_memo
inline
                   
_Unpickler_NewMemo inlined into Unpickler_set_memo 
Unpickler_set_memo
6869
        if (new_memo == NULL)
6870
            return -1;
6871
6872
        for (i = 0; i < new_memo_size; i++) {
loop-vectorize
        
loop not vectorized 
Unpickler_set_memo
loop-unroll
        
unrolled loop by a factor of 2 with run-time trip count 
Unpickler_set_memo
6873
            Py_XINCREF(unpickler->memo[i]);
licm
            
hosting getelementptr 
Unpickler_set_memo
licm
            
failed to move load with loop-invariant address because the loop may invalidate its value 
Unpickler_set_memo
gvn
            
load of type %struct._object** not eliminated because it is clobbered by store 
Unpickler_set_memo
gvn
            
load of type %struct._object** not eliminated because it is clobbered by call 
Unpickler_set_memo
loop-vectorize
            
loop not vectorized: control flow cannot be substituted for a select 
Unpickler_set_memo
6874
            new_memo[i] = unpickler->memo[i];
6875
        }
6876
    }
6877
    else if (PyDict_Check(obj)) {
6878
        Py_ssize_t i = 0;
6879
        PyObject *key, *value;
6880
6881
        new_memo_size = PyDict_Size(obj);
inline
                        
PyDict_Size will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6882
        new_memo = _Unpickler_NewMemo(new_memo_size);
inline
                   
_Unpickler_NewMemo can be inlined into Unpickler_set_memo with cost=60 (threshold=250) 
Unpickler_set_memo
inline
                   
_Unpickler_NewMemo inlined into Unpickler_set_memo 
Unpickler_set_memo
6883
        if (new_memo == NULL)
loop-vectorize
            
loop not vectorized: loop control flow is not understood by vectorizer 
Unpickler_set_memo
loop-vectorize
            
loop not vectorized 
Unpickler_set_memo
6884
            return -1;
6885
6886
        while (PyDict_Next(obj, &i, &key, &value)) {
inline
               
PyDict_Next will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6887
            Py_ssize_t idx;
6888
            if (!PyLong_Check(key)) {
licm
                 
failed to move load with loop-invariant address because the loop may invalidate its value 
Unpickler_set_memo
gvn
                 
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_memo
6889
                PyErr_SetString(PyExc_TypeError,
inline
                
PyErr_SetString will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_memo
6890
                                "memo key must be integers");
6891
                goto error;
6892
            }
6893
            idx = PyLong_AsSsize_t(key);
inline
                  
PyLong_AsSsize_t will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6894
            if (idx == -1 && PyErr_Occurred())
inline
                             
PyErr_Occurred will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6895
                goto error;
6896
            if (idx < 0) {
6897
                PyErr_SetString(PyExc_ValueError,
inline
                
PyErr_SetString will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_memo
gvn
                                
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_memo
6898
                                "memo key must be positive integers.");
6899
                goto error;
6900
            }
6901
            if (_Unpickler_MemoPut(self, idx, value) < 0)
inline
                
_Unpickler_MemoPut too costly to inline (cost=265, threshold=250) 
Unpickler_set_memo
inline
                
_Unpickler_MemoPut will not be inlined into Unpickler_set_memo 
Unpickler_set_memo
licm
                                              
failed to move load with loop-invariant address because the loop may invalidate its value 
Unpickler_set_memo
gvn
                                              
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_memo
6902
                goto error;
6903
        }
6904
    }
6905
    else {
6906
        PyErr_Format(PyExc_TypeError,
inline
        
PyErr_Format will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6907
                     "'memo' attribute must be an UnpicklerMemoProxy object"
6908
                     "or dict, not %.200s", Py_TYPE(obj)->tp_name);
6909
        return -1;
6910
    }
6911
6912
    _Unpickler_MemoCleanup(self);
inline
    
_Unpickler_MemoCleanup can be inlined into Unpickler_set_memo with cost=120 (threshold=250) 
Unpickler_set_memo
inline
    
_Unpickler_MemoCleanup inlined into Unpickler_set_memo 
Unpickler_set_memo
6913
    self->memo_size = new_memo_size;
6914
    self->memo = new_memo;
6915
6916
    return 0;
6917
6918
  error:
6919
    if (new_memo_size) {
6920
        i = new_memo_size;
6921
        while (--i >= 0) {
loop-vectorize
        
loop not vectorized 
Unpickler_set_memo
6922
            Py_XDECREF(new_memo[i]);
loop-vectorize
            
loop not vectorized: control flow cannot be substituted for a select 
Unpickler_set_memo
6923
        }
6924
        PyMem_FREE(new_memo);
inline
        
PyMem_Free will not be inlined into Unpickler_set_memo because its definition is unavailable 
Unpickler_set_memo
6925
    }
6926
    return -1;
6927
}
6928
6929
static PyObject *
6930
Unpickler_get_persload(UnpicklerObject *self)
6931
{
6932
    if (self->pers_func == NULL)
6933
        PyErr_SetString(PyExc_AttributeError, "persistent_load");
inline
        
PyErr_SetString will not be inlined into Unpickler_get_persload because its definition is unavailable 
Unpickler_get_persload
6934
    else
6935
        Py_INCREF(self->pers_func);
6936
    return self->pers_func;
gvn
                 
load of type %struct._object* not eliminated in favor of load because it is clobbered by call 
Unpickler_get_persload
gvn
                 
load eliminated by PRE 
Unpickler_get_persload
6937
}
6938
6939
static int
6940
Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6941
{
6942
    if (value == NULL) {
6943
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Unpickler_set_persload because its definition is unavailable 
Unpickler_set_persload
6944
                        "attribute deletion is not supported");
6945
        return -1;
6946
    }
6947
    if (!PyCallable_Check(value)) {
inline
         
PyCallable_Check will not be inlined into Unpickler_set_persload because its definition is unavailable 
Unpickler_set_persload
6948
        PyErr_SetString(PyExc_TypeError,
inline
        
PyErr_SetString will not be inlined into Unpickler_set_persload because its definition is unavailable 
Unpickler_set_persload
gvn
                        
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_persload
6949
                        "persistent_load must be a callable taking "
6950
                        "one argument");
6951
        return -1;
6952
    }
6953
6954
    Py_INCREF(value);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
Unpickler_set_persload
6955
    Py_XSETREF(self->pers_func, value);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
Unpickler_set_persload
gvn
    
load of type i64 not eliminated because it is clobbered by store 
Unpickler_set_persload
6956
6957
    return 0;
6958
}
6959
6960
static PyGetSetDef Unpickler_getsets[] = {
6961
    {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6962
    {"persistent_load", (getter)Unpickler_get_persload,
6963
                        (setter)Unpickler_set_persload},
6964
    {NULL}
6965
};
6966
6967
static PyTypeObject Unpickler_Type = {
6968
    PyVarObject_HEAD_INIT(NULL, 0)
6969
    "_pickle.Unpickler",                /*tp_name*/
6970
    sizeof(UnpicklerObject),            /*tp_basicsize*/
6971
    0,                                  /*tp_itemsize*/
6972
    (destructor)Unpickler_dealloc,      /*tp_dealloc*/
6973
    0,                                  /*tp_print*/
6974
    0,                                  /*tp_getattr*/
6975
    0,                                  /*tp_setattr*/
6976
    0,                                  /*tp_reserved*/
6977
    0,                                  /*tp_repr*/
6978
    0,                                  /*tp_as_number*/
6979
    0,                                  /*tp_as_sequence*/
6980
    0,                                  /*tp_as_mapping*/
6981
    0,                                  /*tp_hash*/
6982
    0,                                  /*tp_call*/
6983
    0,                                  /*tp_str*/
6984
    0,                                  /*tp_getattro*/
6985
    0,                                  /*tp_setattro*/
6986
    0,                                  /*tp_as_buffer*/
6987
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6988
    _pickle_Unpickler___init____doc__,  /*tp_doc*/
6989
    (traverseproc)Unpickler_traverse,   /*tp_traverse*/
6990
    (inquiry)Unpickler_clear,           /*tp_clear*/
6991
    0,                                  /*tp_richcompare*/
6992
    0,                                  /*tp_weaklistoffset*/
6993
    0,                                  /*tp_iter*/
6994
    0,                                  /*tp_iternext*/
6995
    Unpickler_methods,                  /*tp_methods*/
6996
    0,                                  /*tp_members*/
6997
    Unpickler_getsets,                  /*tp_getset*/
6998
    0,                                  /*tp_base*/
6999
    0,                                  /*tp_dict*/
7000
    0,                                  /*tp_descr_get*/
7001
    0,                                  /*tp_descr_set*/
7002
    0,                                  /*tp_dictoffset*/
7003
    _pickle_Unpickler___init__,         /*tp_init*/
7004
    PyType_GenericAlloc,                /*tp_alloc*/
7005
    PyType_GenericNew,                  /*tp_new*/
7006
    PyObject_GC_Del,                    /*tp_free*/
7007
    0,                                  /*tp_is_gc*/
7008
};
7009
7010
/*[clinic input]
7011
7012
_pickle.dump
7013
7014
  obj: object
7015
  file: object
7016
  protocol: object = NULL
7017
  *
7018
  fix_imports: bool = True
7019
7020
Write a pickled representation of obj to the open file object file.
7021
7022
This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7023
be more efficient.
7024
7025
The optional *protocol* argument tells the pickler to use the given
7026
protocol supported protocols are 0, 1, 2, 3 and 4.  The default
7027
protocol is 3; a backward-incompatible protocol designed for Python 3.
7028
7029
Specifying a negative protocol version selects the highest protocol
7030
version supported.  The higher the protocol used, the more recent the
7031
version of Python needed to read the pickle produced.
7032
7033
The *file* argument must have a write() method that accepts a single
7034
bytes argument.  It can thus be a file object opened for binary
7035
writing, an io.BytesIO instance, or any other custom object that meets
7036
this interface.
7037
7038
If *fix_imports* is True and protocol is less than 3, pickle will try
7039
to map the new Python 3 names to the old module names used in Python
7040
2, so that the pickle data stream is readable with Python 2.
7041
[clinic start generated code]*/
7042
7043
static PyObject *
7044
_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
7045
                  PyObject *protocol, int fix_imports)
7046
/*[clinic end generated code: output=a4774d5fde7d34de input=830f8a64cef6f042]*/
7047
{
7048
    PicklerObject *pickler = _Pickler_New();
inline
                             
_Pickler_New can be inlined into _pickle_dump_impl with cost=225 (threshold=250) 
_pickle_dump_impl
inline
                             
_Pickler_New inlined into _pickle_dump_impl 
_pickle_dump_impl
7049
7050
    if (pickler == NULL)
7051
        return NULL;
7052
7053
    if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
inline
        
_Pickler_SetProtocol can be inlined into _pickle_dump_impl with cost=170 (threshold=250) 
_pickle_dump_impl
inline
        
_Pickler_SetProtocol inlined into _pickle_dump_impl 
_pickle_dump_impl
7054
        goto error;
7055
7056
    if (_Pickler_SetOutputStream(pickler, file) < 0)
inline
        
_Pickler_SetOutputStream can be inlined into _pickle_dump_impl with cost=110 (threshold=250) 
_pickle_dump_impl
inline
        
_Pickler_SetOutputStream inlined into _pickle_dump_impl 
_pickle_dump_impl
7057
        goto error;
7058
7059
    if (dump(pickler, obj) < 0)
inline
        
dump can be inlined into _pickle_dump_impl with cost=180 (threshold=250) 
_pickle_dump_impl
inline
        
dump inlined into _pickle_dump_impl 
_pickle_dump_impl
7060
        goto error;
7061
7062
    if (_Pickler_FlushToFile(pickler) < 0)
inline
        
_Pickler_FlushToFile can be inlined into _pickle_dump_impl with cost=180 (threshold=250) 
_pickle_dump_impl
inline
        
_Pickler_FlushToFile inlined into _pickle_dump_impl 
_pickle_dump_impl
7063
        goto error;
7064
7065
    Py_DECREF(pickler);
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
7066
    Py_RETURN_NONE;
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by store 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
7067
7068
  error:
7069
    Py_XDECREF(pickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dump
7070
    return NULL;
7071
}
7072
7073
/*[clinic input]
7074
7075
_pickle.dumps
7076
7077
  obj: object
7078
  protocol: object = NULL
7079
  *
7080
  fix_imports: bool = True
7081
7082
Return the pickled representation of the object as a bytes object.
7083
7084
The optional *protocol* argument tells the pickler to use the given
7085
protocol; supported protocols are 0, 1, 2, 3 and 4.  The default
7086
protocol is 3; a backward-incompatible protocol designed for Python 3.
7087
7088
Specifying a negative protocol version selects the highest protocol
7089
version supported.  The higher the protocol used, the more recent the
7090
version of Python needed to read the pickle produced.
7091
7092
If *fix_imports* is True and *protocol* is less than 3, pickle will
7093
try to map the new Python 3 names to the old module names used in
7094
Python 2, so that the pickle data stream is readable with Python 2.
7095
[clinic start generated code]*/
7096
7097
static PyObject *
7098
_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
7099
                   int fix_imports)
7100
/*[clinic end generated code: output=d75d5cda456fd261 input=293dbeda181580b7]*/
7101
{
7102
    PyObject *result;
7103
    PicklerObject *pickler = _Pickler_New();
inline
                             
_Pickler_New can be inlined into _pickle_dumps_impl with cost=-14775 (threshold=250) 
_pickle_dumps_impl
inline
                             
_Pickler_New inlined into _pickle_dumps_impl 
_pickle_dumps_impl
7104
7105
    if (pickler == NULL)
7106
        return NULL;
7107
7108
    if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
inline
        
_Pickler_SetProtocol can be inlined into _pickle_dumps_impl with cost=170 (threshold=250) 
_pickle_dumps_impl
inline
        
_Pickler_SetProtocol inlined into _pickle_dumps_impl 
_pickle_dumps_impl
7109
        goto error;
7110
7111
    if (dump(pickler, obj) < 0)
inline
        
dump can be inlined into _pickle_dumps_impl with cost=180 (threshold=250) 
_pickle_dumps_impl
inline
        
dump inlined into _pickle_dumps_impl 
_pickle_dumps_impl
7112
        goto error;
7113
7114
    result = _Pickler_GetString(pickler);
inline
             
_Pickler_GetString can be inlined into _pickle_dumps_impl with cost=180 (threshold=250) 
_pickle_dumps_impl
inline
             
_Pickler_GetString inlined into _pickle_dumps_impl 
_pickle_dumps_impl
7115
    Py_DECREF(pickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
7116
    return result;
7117
7118
  error:
7119
    Py_XDECREF(pickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_dumps
7120
    return NULL;
7121
}
7122
7123
/*[clinic input]
7124
7125
_pickle.load
7126
7127
  file: object
7128
  *
7129
  fix_imports: bool = True
7130
  encoding: str = 'ASCII'
7131
  errors: str = 'strict'
7132
7133
Read and return an object from the pickle data stored in a file.
7134
7135
This is equivalent to ``Unpickler(file).load()``, but may be more
7136
efficient.
7137
7138
The protocol version of the pickle is detected automatically, so no
7139
protocol argument is needed.  Bytes past the pickled object's
7140
representation are ignored.
7141
7142
The argument *file* must have two methods, a read() method that takes
7143
an integer argument, and a readline() method that requires no
7144
arguments.  Both methods should return bytes.  Thus *file* can be a
7145
binary file object opened for reading, an io.BytesIO object, or any
7146
other custom object that meets this interface.
7147
7148
Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7149
which are used to control compatibility support for pickle stream
7150
generated by Python 2.  If *fix_imports* is True, pickle will try to
7151
map the old Python 2 names to the new names used in Python 3.  The
7152
*encoding* and *errors* tell pickle how to decode 8-bit string
7153
instances pickled by Python 2; these default to 'ASCII' and 'strict',
7154
respectively.  The *encoding* can be 'bytes' to read these 8-bit
7155
string instances as bytes objects.
7156
[clinic start generated code]*/
7157
7158
static PyObject *
7159
_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
7160
                  const char *encoding, const char *errors)
7161
/*[clinic end generated code: output=69e298160285199e input=01b44dd3fc07afa7]*/
7162
{
7163
    PyObject *result;
7164
    UnpicklerObject *unpickler = _Unpickler_New();
inline
                                 
_Unpickler_New too costly to inline (cost=400, threshold=250) 
_pickle_load_impl
inline
                                 
_Unpickler_New will not be inlined into _pickle_load_impl 
_pickle_load_impl
inline
                                 
_Unpickler_New too costly to inline (cost=400, threshold=250) 
_pickle_load
inline
                                 
_Unpickler_New will not be inlined into _pickle_load 
_pickle_load
7165
7166
    if (unpickler == NULL)
7167
        return NULL;
7168
7169
    if (_Unpickler_SetInputStream(unpickler, file) < 0)
inline
        
_Unpickler_SetInputStream too costly to inline (cost=500, threshold=250) 
_pickle_load_impl
inline
        
_Unpickler_SetInputStream will not be inlined into _pickle_load_impl 
_pickle_load_impl
inline
        
_Unpickler_SetInputStream too costly to inline (cost=500, threshold=250) 
_pickle_load
inline
        
_Unpickler_SetInputStream will not be inlined into _pickle_load 
_pickle_load
7170
        goto error;
7171
7172
    if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
inline
        
_Unpickler_SetInputEncoding can be inlined into _pickle_load_impl with cost=110 (threshold=250) 
_pickle_load_impl
inline
        
_Unpickler_SetInputEncoding inlined into _pickle_load_impl 
_pickle_load_impl
7173
        goto error;
7174
7175
    unpickler->fix_imports = fix_imports;
7176
7177
    result = load(unpickler);
inline
             
load too costly to inline (cost=655, threshold=625) 
_pickle_load_impl
inline
             
load will not be inlined into _pickle_load_impl 
_pickle_load_impl
inline
             
load too costly to inline (cost=655, threshold=625) 
_pickle_load
inline
             
load will not be inlined into _pickle_load 
_pickle_load
7178
    Py_DECREF(unpickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load
7179
    return result;
7180
7181
  error:
7182
    Py_XDECREF(unpickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_load
7183
    return NULL;
7184
}
7185
7186
/*[clinic input]
7187
7188
_pickle.loads
7189
7190
  data: object
7191
  *
7192
  fix_imports: bool = True
7193
  encoding: str = 'ASCII'
7194
  errors: str = 'strict'
7195
7196
Read and return an object from the given pickle data.
7197
7198
The protocol version of the pickle is detected automatically, so no
7199
protocol argument is needed.  Bytes past the pickled object's
7200
representation are ignored.
7201
7202
Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7203
which are used to control compatibility support for pickle stream
7204
generated by Python 2.  If *fix_imports* is True, pickle will try to
7205
map the old Python 2 names to the new names used in Python 3.  The
7206
*encoding* and *errors* tell pickle how to decode 8-bit string
7207
instances pickled by Python 2; these default to 'ASCII' and 'strict',
7208
respectively.  The *encoding* can be 'bytes' to read these 8-bit
7209
string instances as bytes objects.
7210
[clinic start generated code]*/
7211
7212
static PyObject *
7213
_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
7214
                   const char *encoding, const char *errors)
7215
/*[clinic end generated code: output=1e7cb2343f2c440f input=70605948a719feb9]*/
7216
{
7217
    PyObject *result;
7218
    UnpicklerObject *unpickler = _Unpickler_New();
inline
                                 
_Unpickler_New too costly to inline (cost=400, threshold=250) 
_pickle_loads_impl
inline
                                 
_Unpickler_New will not be inlined into _pickle_loads_impl 
_pickle_loads_impl
inline
                                 
_Unpickler_New too costly to inline (cost=400, threshold=250) 
_pickle_loads
inline
                                 
_Unpickler_New will not be inlined into _pickle_loads 
_pickle_loads
7219
7220
    if (unpickler == NULL)
7221
        return NULL;
7222
7223
    if (_Unpickler_SetStringInput(unpickler, data) < 0)
inline
        
_Unpickler_SetStringInput can be inlined into _pickle_loads_impl with cost=-14905 (threshold=250) 
_pickle_loads_impl
inline
        
_Unpickler_SetStringInput inlined into _pickle_loads_impl 
_pickle_loads_impl
7224
        goto error;
7225
7226
    if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
inline
        
_Unpickler_SetInputEncoding can be inlined into _pickle_loads_impl with cost=110 (threshold=250) 
_pickle_loads_impl
inline
        
_Unpickler_SetInputEncoding inlined into _pickle_loads_impl 
_pickle_loads_impl
7227
        goto error;
7228
7229
    unpickler->fix_imports = fix_imports;
7230
7231
    result = load(unpickler);
inline
             
load too costly to inline (cost=655, threshold=625) 
_pickle_loads_impl
inline
             
load will not be inlined into _pickle_loads_impl 
_pickle_loads_impl
inline
             
load too costly to inline (cost=655, threshold=625) 
_pickle_loads
inline
             
load will not be inlined into _pickle_loads 
_pickle_loads
7232
    Py_DECREF(unpickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads
7233
    return result;
7234
7235
  error:
7236
    Py_XDECREF(unpickler);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads_impl
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads
gvn
    
load of type i64 not eliminated because it is clobbered by call 
_pickle_loads
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads
gvn
    
load of type %struct._typeobject* not eliminated because it is clobbered by call 
_pickle_loads
7237
    return NULL;
7238
}
7239
7240
static struct PyMethodDef pickle_methods[] = {
7241
    _PICKLE_DUMP_METHODDEF
7242
    _PICKLE_DUMPS_METHODDEF
7243
    _PICKLE_LOAD_METHODDEF
7244
    _PICKLE_LOADS_METHODDEF
7245
    {NULL, NULL} /* sentinel */
7246
};
7247
7248
static int
7249
pickle_clear(PyObject *m)
7250
{
7251
    _Pickle_ClearState(_Pickle_GetState(m));
inline
                       
_Pickle_GetState can be inlined into pickle_clear with cost=0 (threshold=375) 
pickle_clear
inline
                       
_Pickle_GetState inlined into pickle_clear 
pickle_clear
inline
    
_Pickle_ClearState too costly to inline (cost=630, threshold=625) 
pickle_clear
inline
    
_Pickle_ClearState will not be inlined into pickle_clear 
pickle_clear
7252
    return 0;
7253
}
7254
7255
static void
7256
pickle_free(PyObject *m)
7257
{
7258
    _Pickle_ClearState(_Pickle_GetState(m));
inline
                       
_Pickle_GetState can be inlined into pickle_free with cost=0 (threshold=375) 
pickle_free
inline
                       
_Pickle_GetState inlined into pickle_free 
pickle_free
inline
    
_Pickle_ClearState too costly to inline (cost=630, threshold=625) 
pickle_free
inline
    
_Pickle_ClearState will not be inlined into pickle_free 
pickle_free
7259
}
7260
7261
static int
7262
pickle_traverse(PyObject *m, visitproc visit, void *arg)
7263
{
7264
    PickleState *st = _Pickle_GetState(m);
inline
                      
_Pickle_GetState can be inlined into pickle_traverse with cost=0 (threshold=375) 
pickle_traverse
inline
                      
_Pickle_GetState inlined into pickle_traverse 
pickle_traverse
7265
    Py_VISIT(st->PickleError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7266
    Py_VISIT(st->PicklingError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7267
    Py_VISIT(st->UnpicklingError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7268
    Py_VISIT(st->dispatch_table);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7269
    Py_VISIT(st->extension_registry);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7270
    Py_VISIT(st->extension_cache);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7271
    Py_VISIT(st->inverted_registry);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7272
    Py_VISIT(st->name_mapping_2to3);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7273
    Py_VISIT(st->import_mapping_2to3);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7274
    Py_VISIT(st->name_mapping_3to2);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7275
    Py_VISIT(st->import_mapping_3to2);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7276
    Py_VISIT(st->codecs_encode);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7277
    Py_VISIT(st->getattr);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
pickle_traverse
7278
    return 0;
7279
}
7280
7281
static struct PyModuleDef _picklemodule = {
7282
    PyModuleDef_HEAD_INIT,
7283
    "_pickle",            /* m_name */
7284
    pickle_module_doc,    /* m_doc */
7285
    sizeof(PickleState),  /* m_size */
7286
    pickle_methods,       /* m_methods */
7287
    NULL,                 /* m_reload */
7288
    pickle_traverse,      /* m_traverse */
7289
    pickle_clear,         /* m_clear */
7290
    (freefunc)pickle_free /* m_free */
7291
};
7292
7293
PyMODINIT_FUNC
7294
PyInit__pickle(void)
7295
{
7296
    PyObject *m;
7297
    PickleState *st;
7298
7299
    m = PyState_FindModule(&_picklemodule);
inline
        
PyState_FindModule will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7300
    if (m) {
7301
        Py_INCREF(m);
gvn
        
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
7302
        return m;
7303
    }
7304
7305
    if (PyType_Ready(&Unpickler_Type) < 0)
inline
        
PyType_Ready will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7306
        return NULL;
7307
    if (PyType_Ready(&Pickler_Type) < 0)
inline
        
PyType_Ready will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7308
        return NULL;
7309
    if (PyType_Ready(&Pdata_Type) < 0)
inline
        
PyType_Ready will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7310
        return NULL;
7311
    if (PyType_Ready(&PicklerMemoProxyType) < 0)
inline
        
PyType_Ready will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7312
        return NULL;
7313
    if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
inline
        
PyType_Ready will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7314
        return NULL;
7315
7316
    /* Create the module and add the functions. */
7317
    m = PyModule_Create(&_picklemodule);
inline
        
PyModule_Create2 will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7318
    if (m == NULL)
7319
        return NULL;
7320
7321
    Py_INCREF(&Pickler_Type);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
7322
    if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
inline
        
PyModule_AddObject will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7323
        return NULL;
7324
    Py_INCREF(&Unpickler_Type);
gvn
    
load of type i64 not eliminated because it is clobbered by call 
PyInit__pickle
7325
    if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
inline
        
PyModule_AddObject will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7326
        return NULL;
7327
7328
    st = _Pickle_GetState(m);
inline
         
_Pickle_GetState can be inlined into PyInit__pickle with cost=0 (threshold=375) 
PyInit__pickle
inline
         
_Pickle_GetState inlined into PyInit__pickle 
PyInit__pickle
7329
7330
    /* Initialize the exceptions. */
7331
    st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
inline
                      
PyErr_NewException will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7332
    if (st->PickleError == NULL)
7333
        return NULL;
7334
    st->PicklingError = \
7335
        PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
inline
        
PyErr_NewException will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7336
    if (st->PicklingError == NULL)
7337
        return NULL;
7338
    st->UnpicklingError = \
7339
        PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
inline
        
PyErr_NewException will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
gvn
                                                          
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
PyInit__pickle
7340
    if (st->UnpicklingError == NULL)
7341
        return NULL;
7342
7343
    Py_INCREF(st->PickleError);
gvn
    
load of type %struct._object* not eliminated because it is clobbered by call 
PyInit__pickle
7344
    if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
inline
        
PyModule_AddObject will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7345
        return NULL;
7346
    Py_INCREF(st->PicklingError);
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
PyInit__pickle
7347
    if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
inline
        
PyModule_AddObject will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7348
        return NULL;
7349
    Py_INCREF(st->UnpicklingError);
gvn
    
load of type %struct._object* not eliminated in favor of store because it is clobbered by call 
PyInit__pickle
7350
    if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
inline
        
PyModule_AddObject will not be inlined into PyInit__pickle because its definition is unavailable 
PyInit__pickle
7351
        return NULL;
7352
7353
    if (_Pickle_InitState(st) < 0)
inline
        
_Pickle_InitState can be inlined into PyInit__pickle with cost=-13150 (threshold=250) 
PyInit__pickle
inline
        
_Pickle_InitState inlined into PyInit__pickle 
PyInit__pickle
7354
        return NULL;
7355
7356
    return m;
7357
}
7358
7359